我目前有一个运行并使用Ratchet PHP的Web套接字服务器。我不在我希望外部脚本与我的服务器通信的阶段。我可以使用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'));
我的$pusher
变量加载我的文件,该文件实现了一些棘轮接口。但基本上我只是返回一个字符串:
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()
上的第二个参数有多重要?看起来像一个永远不会再使用的字符串。
干杯
已更新
答案 0 :(得分:1)
在你的pull.php文件中,你有一个REQ
套接字连接到PULL
套接字。 Check out the docs查看兼容的套接字对。特别是,您似乎需要一个REQ-REP
对,以便您的客户端可以请求数据,并且您的服务器会回复一个响应。如果您的服务器为下一个客户端排队准备好数据,那么您将使用PUSH-PULL
,然后您的客户端将从队列中提取下一个内容。
在任何一种情况下,您都无法将REQ
套接字连接到PULL
套接字或PUSH
套接字。
我不完全理解您列出的代码或命名方案中的用例或通信架构,所以我不知道我能提供多少详细信息,请随时澄清发生了什么,我可能会能够更明确地建议你应该使用什么套接字策略。
答案 1 :(得分:0)
你的pull.php中有这一行:
echo $socket->recv();
推送套接字用于发送消息,而不是接收消息。这可能是异常的来源。
另外:拉套接字上方法on()
的第一个参数应为'message'
。
$pull->on('message', array($pusher, 'onPull'));