【问题标题】:React/ZMQ: REQ REP only working onceReact/ZMQ:REQ REP 只工作一次
【发布时间】:2015-04-01 23:07:11
【问题描述】:

我正在尝试通过 websocket 向我的服务器发送请求,并从服务器返回回复。这是“某种”工作,但是我只能这样做一次,任何额外的请求都会挂在某个地方。

服务器绑定:

$pull = $context->getSocket(ZMQ::SOCKET_REP);
$pull->bind('tcp://127.0.0.1:5552');
$pull->on('message', array($pusher, 'onPull'));
$pull->recv();
$pull->send('back');

我的服务器上有一个静态 PHP 文件,当我运行它时,想从服务器返回回复:

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_REQ, 'Sock');
$socket->connect("tcp://localhost:5552");

$socket->send('sending');

$message = $socket->recv();

echo "$message";

现在,当我启动服务器并运行我的 php 文件时,我得到了“返回”响应。但是,当我尝试再次运行它时,它就会挂起。我每次都收到请求?

另外,谁能向我解释一下$pull->on 位,我在任何地方都找不到它的作用。


完整的服务器代码:

<?php
    require './vendor/autoload.php';

    $loop   = React\EventLoop\Factory::create();
    $pusher = new MyApp\Pusher;

    $context = new React\ZMQ\Context($loop);

    $push = $context->getSocket(ZMQ::SOCKET_PULL);
    $push->bind('tcp://127.0.0.1:5555');
    $push->on('message', array($pusher, 'onNewPush'));

    $pull = $context->getSocket(ZMQ::SOCKET_REP);
    $pull->bind('tcp://127.0.0.1:5552');
    $pull->on('message', array($pusher, 'onPull'));
    $pull->recv();
    $pull->send('back');

    $webSock = new React\Socket\Server($loop);
    $webSock->listen(8080, '0.0.0.0');
    $webServer = new Ratchet\Server\IoServer(
        new Ratchet\Http\HttpServer(
            new Ratchet\WebSocket\WsServer(
                $pusher
            )
        ),
        $webSock
    );

    $loop->run();

【问题讨论】:

  • 你需要一个循环,显式(使用 while 或 for)或隐式使用 react 的消息循环。您不应该在此循环中使用bind()on()(注册消息处理程序)!如果这些都不适用于您的代码,也许您可​​以将其放大一点,以便甚至可以运行它进行测试。
  • 我在帖子中添加了完整服务器代码的链接。所以你是说我的静态 PHP 文件中需要一个循环?
  • 哦,刚刚发现问题所在:recv()(以及部分send())不应该存在。关键是,当消息到达时,它会调用 $pusher-&gt;onPull() 并发送消息,并且只有在您调用 $pull-&gt;send() 时才会回复。没有它,你只需调用$loop-&gt;run(),这正是我的意思。
  • 哦,我明白了,我如何从我的 onPull 方法返回它?
  • Gah 还是搞不定。

标签: php zeromq reactphp


【解决方案1】:

我认为这样的事情应该可以完成:

$pull->on(
    'message',
    function ($message) use ($pull) {
        $pull->send('response');
    }
);

在任何情况下,无论您使用上述匿名函数还是对象/方法对,您都需要访问$pull,因为这是允许您发送消息的通信通道。 http://socketo.me/docs/push 的示例似乎是您的代码的基础,不需要它,因为它使用了仅接收消息的拉式套接字。

【讨论】:

  • 非常感谢,现在可以使用了。如果我也将$pusher 变量传递给use(),我就可以访问该类并发回返回值。干杯:)
猜你喜欢
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2018-06-22
  • 2015-09-18
  • 2013-12-31
  • 1970-01-01
相关资源
最近更新 更多