Периодически отправлять сообщения определенным клиентам в Ratchet, используя ReactPHP - PullRequest
0 голосов
/ 30 октября 2019

Общая информация Работа над системой чатов с использованием Ratchet PHP. По запросу моих пользователей я пытаюсь внедрить Triviabot в конкретный чат. Чаты на самом деле не "существуют". Вместо этого он проверяет, какие идентификаторы клиентов перечислены в массиве, и отправляет сообщения только этим клиентам.

Идея состоит в том, чтобы задавать вопрос каждые x секунд.

ПроблемаРеализация периодического таймера ReactPHP не является проблемой. Это работает, как ожидалось. Проблема в том, что он блокирует любые соединения с веб-сокетом, как только таймер включен. Нет ошибок, кроме тех, которые на стороне клиента говорят, что соединение не может быть установлено.

Соответствующий код

<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use React\EventLoop\Factory;

class Chat implements MessageComponentInterface {
    private $msgLoop;

    public function __construct() {
        $this->startTriviaBot();
    }

    private function startTriviaBot(){
        $this->msgLoop = Factory::create();

        $this->msgLoop->addPeriodicTimer(1, function (){

            // This is working as expected confirming the timer works fine
            echo 'test'.PHP_EOL;

            foreach($this->clientIDsPerRoom['trivia'] as $receiverID){
                if(array_key_exists($receiverID, $this->userObjects)){

                    $this->sendMessage('Trivia', 'trivia', 'Bot test message', $receiverID);
                }
            }
        });

        // Commenting this makes the websocket accept connections again
        $this->msgLoop->run();
    }
}

Исследования, которые я провел, которые не помогли

Периодическая отправка сообщений клиентам в Ratchet - Эта функция отправляет сообщения всем клиентам напрямую из создания веб-сокета, а не внутри MessageComponentInterface. У него нет доступа к конкретным клиентам.

Создайте таймер с помощью Ratchet php - Это в основном то, что я делаю, но это вызывает проблему, с которой я сталкиваюсь.

1 Ответ

1 голос
/ 31 октября 2019

Привет, член команды ReactPHP здесь. Похоже, вы создаете новый цикл для запуска таймера. Это действительно остановит начальный цикл событий, который вы создали для запуска Ratchet. Вам нужно также передать цикл событий, который вы создали для Ratchet, в этот класс и использовать его. Может быть только один цикл событий. (Если вы не передадите цикл событий Ratchet, он создаст его для вас и будет использовать его. Передача цикла в Ratchet переопределит это поведение.)

...