【问题标题】:React/ZMQ/Ratchet - Websocket server responseReact/ZMQ/Ratchet - Websocket 服务器响应
【发布时间】: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() 上的第二个参数还有什么重要性?就像一个永远不会再使用的字符串。

干杯

更新

【问题讨论】:

    标签: php websocket zeromq ratchet


    【解决方案1】:

    在您的 pull.php 文件中,您有一个 REQ 套接字连接到一个 PULL 套接字。 Check out the docs 查看兼容的套接字对。特别是,您似乎需要一个 REQ-REP 对,以便您的客户端可以请求数据,而您的服务器会回复一个响应。如果您的服务器为下一个客户端准备好数据排队,然后您的客户端从队列中提取下一个数据,您将使用 PUSH-PULL

    在任何一种情况下,您都不能将REQ 套接字连接到PULL 套接字或PUSH 套接字。

    我不完全了解您列出的代码或命名方案的用例或通信架构,所以我不知道我能提供多少细节,请随时澄清发生了什么,我可能会能够更明确地建议您应该使用哪种套接字策略。

    【讨论】:

    • 是的,我决定阅读并在昨晚发现了这一点。我得到了 REQ REP 序列,但它只工作了一次(我的拉脚本中的任何其他请求都刚刚挂起)。基本上我的用例是:在与 Web 套接字服务器相同的服务器上拥有一个静态 PHP 脚本,并且在 cron 作业中每 30 秒脚本将当前连接的用户获取到我的网络服务器。为了清楚起见,我决定写一个新问题,还没有回复:stackoverflow.com/questions/23891538/…
    • 如果您不再遇到此问题中的问题,您应该接受解决了您的问题的答案,或者自己编写并接受它,这样问题就不会悬而未决.
    【解决方案2】:

    你的 pull.php 中有这一行:

    echo $socket->recv();
    

    推送套接字用于发送消息,而不是接收消息。这可能就是异常的来源。

    另外:方法on()的第一个参数应该是'message'

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

    【讨论】:

    • 再次感谢。我更新了我的 pull.php 以使用 ZMQ::SOCKET_PULL(在此位上找不到任何文档)并删除了 send 部分,现在我的脚本只是执行但不会停止。不知道如何得到回复......嗯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多