@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 на предмет нового сообщения? или как то задиспатчить событие рассылки сообщения... надеюсь я понятно сформулировал вопрос...
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
@rPman
Подключайся к своему же веб-серверу, и отсылай ему системное сообщение (про авторизацию не забудь).

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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽