React / ZMQ:REQ REP仅工作一次

时间:2014-05-26 20:21:00

标签: php zeromq reactphp

我试图通过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();

1 个答案:

答案 0 :(得分:1)

我认为这样的事情应该可以胜任:

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

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