У меня есть проблема, я понятия не имею, как подойти … У меня работает два процесса — один из них слушает сообщения, сортирует их и преобразует их, а другой процесс выполняет другие функции управления и отправляет обычные сообщения плюс преобразованные … Как мне объединить все это в один скрипт?
class Sender {
private $messageQueue;
public function run() {
// open stream
while (true) {
$this->send($this->messageQueue->pop());
if ($this->lastMessageTimestamp + 20 < time) {
$this->keepalive();
}
}
// close stream
}
public function pushMessage(Message $message) {
$this->messageQueue->push($message);
}
private function send(Message $message) {
// send through stream
$this->lastMessageTimestamp = time();
}
private function keepalive() {
$this->messageQueue->push(new KeepAliveMessage());
}
}
Суть в том, что отправитель должен открыть соединение и поддерживать его, отправляя живые сообщения каждые 20 (плюс дополнительные не упомянутые вещи), и выскакивает другие сообщения, которые были переданы ему извне через pushMessage.
class Listener {
public function run() {
while(true) {
$message = $this->listen();
$this->messages->push($message);
$this->processMessages();
}
}
private function processMessages() {
// processing logic, sorting, comparing, analyzing, transforming
$this->echo(Message $processedMessage);
}
public function echo(Message $processedMessage) {
return $processedMessage;
}
}
В то время как слушатель также выполняет прослушивание (возможно, чтение из файла) для других видов сообщений, затем обрабатывает их и формирует правильное сообщение для отправителя.
Моя проблема состоит в том, чтобы объединить все это в одну функциональность, где я мог бы запустить обе неблокирующие друг друга (вилки? Обратные вызовы?), Где я мог бы передать обработанное сообщение от слушателя отправителю для отправки, не блокируя при этом ни слушателя, ни отправителя делают во время бега ….
Любая помощь (псевдокод хорош) будет принята …
(Все это выполняется из команды Laravel, но это не очень важно)
Задача ещё не решена.
Других решений пока нет …