React/ZMQ/Ratchet - Websocket 服务器响应
Posted
技术标签:
【中文标题】React/ZMQ/Ratchet - Websocket 服务器响应【英文标题】:React/ZMQ/Ratchet - Websocket server response 【发布时间】:2014-05-26 17:56:36 【问题描述】:我目前正在运行并使用 Ratchet php 的 Web 套接字服务器。我不是在我希望外部脚本与我的服务器进行通信的阶段。我可以使用 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));
然后在我的网络服务器脚本中,我可以将它发送到一个方法 (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'));
我的$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()
上的第二个参数还有什么重要性?就像一个永远不会再使用的字符串。
干杯
更新
【问题讨论】:
【参考方案1】:在您的 pull.php 文件中,您有一个 REQ
套接字连接到一个 PULL
套接字。 Check out the docs 查看兼容的套接字对。特别是,您似乎需要一个 REQ-REP
对,以便您的客户端可以请求数据,而您的服务器会回复一个响应。如果您的服务器为下一个客户端准备好数据排队,然后您的客户端从队列中提取下一个数据,您将使用 PUSH-PULL
。
在任何一种情况下,您都不能将REQ
套接字连接到PULL
套接字或PUSH
套接字。
我不完全了解您列出的代码或命名方案的用例或通信架构,所以我不知道我能提供多少细节,请随时澄清发生了什么,我可能会能够更明确地建议您应该使用哪种套接字策略。
【讨论】:
是的,我决定阅读并在昨晚发现了这一点。我得到了 REQ REP 序列,但它只工作了一次(我的拉脚本中的任何其他请求都刚刚挂起)。基本上我的用例是:在与 Web 套接字服务器相同的服务器上拥有一个静态 PHP 脚本,并且在 cron 作业中每 30 秒脚本将当前连接的用户获取到我的网络服务器。为了清楚起见,我决定写一个新问题,还没有回复:***.com/questions/23891538/… 如果您不再遇到此问题中的问题,您应该接受解决了您的问题的答案,或者自己编写并接受它,这样问题就不会悬而未决.【参考方案2】:你的 pull.php 中有这一行:
echo $socket->recv();
推送套接字用于发送消息,而不是接收消息。这可能就是异常的来源。
另外:方法on()
的第一个参数应该是'message'
。
$pull->on('message', array($pusher, 'onPull'));
【讨论】:
再次感谢。我更新了我的 pull.php 以使用ZMQ::SOCKET_PULL
(在此位上找不到任何文档)并删除了 send
部分,现在我的脚本只是执行但不会停止。不知道如何得到回复......嗯。以上是关于React/ZMQ/Ratchet - Websocket 服务器响应的主要内容,如果未能解决你的问题,请参考以下文章