Общая информация Работа над системой чатов с использованием 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 - Это в основном то, что я делаю, но это вызывает проблему, с которой я сталкиваюсь.