Symfony2 WebSocketBundle - ZMQ Push не работает

Я использую Symfony2 для создания простого приложения чата. Я решил использовать GeniusesOfSymfony/WebSocketBundle для моего WebSocket, который работает на Ratchet:

https://github.com/GeniusesOfSymfony/WebSocketBundle

Мне удалось заставить чат работать, используя PubSub, но я хочу вместо этого использовать интеграцию push: я хочу, чтобы клиент отправлял сообщение через AJAX на мой контроллер Symfony2, который, в свою очередь, должен передавать сообщение всем клиентам WebSocket.

Я следовал за этой страницей документации:

https://github.com/GeniusesOfSymfony/WebSocketBundle/blob/master/Resources/docs/Pusher.md

Я пытался использовать как ZMQ, так и Websocket Pusher.

С ZMQ, когда я запускаю websocket, я получаю уведомление cmd:

Прослушивание транспорта ZMQ на 127.0.0.1:5555

Однако отправка сообщений не работает:

$pusher = $this->container->get("gos_web_socket.zmq.pusher");
//push(data, route_name, route_arguments)
$pusher->push(["type" => "newMessage", "text" => $request->request->get("msg")], "chat_topic");

Это метод onPush в моем классе ChatTopic:

class ChatTopic implements TopicInterface, PushableTopicInterface {

    public function onPush(Topic $topic, WampRequest $request, $data, $provider) {
        $topic->broadcast($data);
    }
}

Метод onPush никогда не вызывается. Кроме того, события толкателя никогда не запускаются. Там, кажется, не исключение в коде.

С WebSocket Pusher я даже не могу запустить сервис. В cmd нет уведомлений, как в ZMQ, и с netstat команды netstat я не смог обнаружить, что он прослушивает порт 1337. Когда я пытаюсь нажать на него, я получаю исключение:

Не удалось открыть сокет. Причина: не удалось установить соединение, потому что целевой компьютер активно отказался от него

Вероятно, потому что нет службы, слушающей порт 1337.

PS - Я на Windows 10 и использую сервер WAMP. Я успешно установил расширение ZMQ на WAMP, как указано в phpinfo().

Ответ 1

Документация, которую вы цитировали, pusher.md, не является полной. Вы также должны зарегистрировать свою тему в качестве службы и отметить ее как доступную тему для конфигурации.

Лучше всего будет следовать TopicSetup.md. Тем не менее, здесь отсутствует основной момент.

Новый класс ChatTopic может быть зарегистрирован в AppBundle/Resources/config/services.yml Symfony Services и помечен так:

services:
    app.chat_topic_service:
        class: App\AppBundle\Topic\ChatTopic
        tags:
            - { name: gos_web_socket.topic }