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 }