В настоящее время у меня работает сервер веб-сокетов и работает с Ratchet PHP. Я не на том этапе, когда мне нужно, чтобы внешние скрипты связывались с моим сервером. Я могу успешно использовать для этого данные с помощью ZMQ:
$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')); ...
Так что это прекрасно работает, но у меня возникли проблемы с попыткой получить ответ. Я пытаюсь что-то вроде:
$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'));