问题
I've currently got a web socket server running and working with Ratchet PHP. I'm not at the stage where I want external scripts to communicate with my server. I can successfully push data to it using 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));
Then in my webserver script I can send this to a method (onNewPush
) to do something with it when the push.php file is run (ran?):
...
$push = $context->getSocket(ZMQ::SOCKET_PULL);
$push->bind('tcp://127.0.0.1:5555');
$push->on('Push Notification', array($pusher, 'onNewPush'));
...
So this works fine, but I'm having trouble trying to receive a response back. I'm trying something like:
pull.php
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_REQ, 'Pull Notification');
$socket->connect("tcp://localhost:5554");
$socket->send('data');
echo $socket->recv();
Then in my server script:
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5554');
$pull->on('message', array($pusher, 'onPull'));
My $pusher
variable loads my file which implements a few Ratchet Interfaces. But essentially I'm just returning a string:
public function onPull()
{
return "some data";
}
When running pull.php
I get the error:
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
Does anyone know why?
Also what importance does the second parameter on getSocket()
have? Just seems like a string which is never used again.
Cheers
UPDATED
回答1:
In your pull.php file, you've got a REQ
socket connecting to a PULL
socket. Check out the docs to see compatible socket pairs. In particular, it appears that you want a REQ-REP
pair so that your client can request data and your server replies with a response. You'd use PUSH-PULL
if your server queues up data ready for the next client, and then your client pulls whatever is next from the queue.
In either event, you cannot connect a REQ
socket to a PULL
socket or a PUSH
socket.
I don't fully understand your use case or communication architecture from the listed code or naming scheme, so I don't know how much more detail I can give than that, feel free to clarify what's going on and I might be able to advise more definitively what socket strategy you should be using.
回答2:
You have this line in your pull.php:
echo $socket->recv();
Push socket is for sending messages, not receiving them. That's probably where the exception comes from.
Also: The first parameter of method on()
on pull sockets should be 'message'
.
$pull->on('message', array($pusher, 'onPull'));
来源:https://stackoverflow.com/questions/23875497/react-zmq-ratchet-websocket-server-response