React / ZMQ / Ratchet – ответ сервера Websocket

В настоящее время у меня работает сервер веб-сокетов и работает с Ratchet PHP. Я не на том этапе, когда мне нужно, чтобы внешние скрипты связывались с моим сервером. Я могу успешно использовать для этого данные с помощью ZMQ:

push.php

$json = ['name' => 'Joe Bloggs']; $context = new ZMQContext(); $socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'Push Notification'); $socket->connect("tcp://localhost:5555"); $socket->send(json_encode($json)); 

Затем в моем сценарии webserver я могу отправить это методу ( onNewPush ), чтобы что-то сделать с ним, когда файл push.php запущен (запущен?):

 ... $push = $context->getSocket(ZMQ::SOCKET_PULL); $push->bind('tcp://127.0.0.1:5555'); $push->on('Push Notification', array($pusher, 'onNewPush')); ... 

Так что это прекрасно работает, но у меня возникли проблемы с попыткой получить ответ. Я пытаюсь что-то вроде:

pull.php

 $context = new ZMQContext(); $socket = $context->getSocket(ZMQ::SOCKET_REQ, 'Pull Notification'); $socket->connect("tcp://localhost:5554"); $socket->send('data'); echo $socket->recv(); 

Затем в моем скрипте сервера:

 $pull = $context->getSocket(ZMQ::SOCKET_PULL); $pull->bind('tcp://127.0.0.1:5554'); $pull->on('message', array($pusher, 'onPull')); - $pull = $context->getSocket(ZMQ::SOCKET_PULL); $pull->bind('tcp://127.0.0.1:5554'); $pull->on('message', array($pusher, 'onPull')); 

Моя переменная $pusher загружает мой файл, который реализует несколько интерфейсов Ratchet. Но по существу я просто возвращаю строку:

 public function onPull() { return "some data"; } 

При запуске pull.php я получаю ошибку:

 Fatal error: Uncaught exception 'ZMQSocketException' with message 'Failed to receive message: Not supported' in websockets\pull.php:9 Stack trace: #0 websockets\pull.php(9): ZMQSocket->recv() #1 {main} thrown in websockets\pull.php on line 9 

Кто-нибудь знает, почему?

Также какое значение имеет второй параметр в getSocket() ? Просто кажется, что строка никогда не используется снова.

ура

ОБНОВЛЕНО

В файле pull.php у вас есть разъем REQ подключаемый к гнезду PULL . Проверьте документы, чтобы увидеть совместимые пары сокетов. В частности, кажется, что вам нужна пара REQ-REP чтобы ваш клиент мог запросить данные, а ваш сервер ответил с ответом. Вы должны использовать PUSH-PULL если ваш сервер ставит в очередь данные, готовые для следующего клиента, а затем ваш клиент вытаскивает все, что находится рядом с очередью.

В любом случае вы не можете подключить разъем REQ гнезду PULL или гнезду PUSH .

Я не полностью понимаю ваш прецедент или коммуникационную архитектуру из приведенного кода или схемы именования, поэтому я не знаю, насколько более подробно я могу дать, чем это, не стесняйтесь уточнять, что происходит, и я мог бы советовать более определенно, какую стратегию сокета вы должны использовать.

У вас есть эта строка в файле pull.php:

 echo $socket->recv(); 

Push-разъем предназначен для отправки сообщений, а не для их приема. Вероятно, это исключение.

Кроме того: первым параметром метода on() в pull-сокетах должно быть 'message' .

 $pull->on('message', array($pusher, 'onPull'));