@MasterCopipaster

Есть идеи как диспатчить события в WS сервере ratchet?

Всем привет, я написал небольшой WS сервер по это статье
По итогу у меня получилась такая консольная команда
Которая и запускает сам WS сервер
<?php
    namespace App\Command;
     
    use Ratchet\Http\HttpServer;
    use Ratchet\Server\IoServer;
    use Ratchet\WebSocket\WsServer;
    use App\Websocket\MessageHandler;
    use Symfony\Component\Console\Command\Command;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;
     
    class WebsocketServerCommand extends Command
    {
        protected static $defaultName = "run:websocket-server";
     
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $port = 3001;
            $output->writeln("Starting server on port " . $port);
            $server = IoServer::factory(
                new HttpServer(
                    new WsServer(
                        new MessageHandler()
                    )
                ),
                $port
            );
            $server->run();
            return 0;
        }
    }


И обработчик соединений
<?php
    namespace App\Websocket;
     
    use Exception;
    use Ratchet\ConnectionInterface;
    use Ratchet\MessageComponentInterface;
     
     
    class MessageHandler implements MessageComponentInterface
    {
     
        public function onOpen(ConnectionInterface $conn)
        {
     
        }
     
        public function onMessage(ConnectionInterface $from, $msg)
        {
     
        }
     
        public function onClose(ConnectionInterface $conn)
        {
     
        }
     
        public function onError(ConnectionInterface $conn, Exception $e)
        {
     
        }
    }


Собственно вопрос в чем, у меня WS подключено куча клиентов, и они между собой не общаются они только принимают сообщения, мне надо разослать 1 сообщение всем подключенным клиентам.
Тоесть мне надо как то дернуть события onMessage что бы разослать сообщения все подключенным клиентам.
(Ну наверное... я так думаю) - но чет вот я не знаю как правильно дернуть такое событие? веть мне нужно еще проверить есть ли у меня для них новое сообщение, я думал положить сообщение в memcache и брать его от туда, но в каком именно моменте и где я должен проверять не появилось ли там сообщение?
В общем кто работал с ratchet можете подсказать как например проверить memcache на предмет нового сообщения? или как то задиспатчить событие рассылки сообщения... надеюсь я понятно сформулировал вопрос...
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
@rPman
Подключайся к своему же веб-серверу, и отсылай ему системное сообщение (про авторизацию не забудь).

Вебсокет ратчет сервер это 1-поточное приложение, соответственно получив сообщение будет исполнен метод в том же пространстве где можно хранить список клиентов. Точно помню у ратчет был массив со списком всех подключенных клиентов, не уверен, доступен ли он публично напрямую, но в худшем случае можно собирать собственный список, доступный глобально.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы