2012-06-22 134 views
3

我在使用ZeroMQ时出现了一个奇怪的问题,其中一些消息被卡住了,而当新消息到达时就会变得不稳定。这就像新消息将卡住的信息推到门上一样(我知道可怕的比较)。ZeroMQ中卡住的消息

我的代码是非常简单:

rep.php

$context = new ZMQContext; 
$receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL); 
$receiver->connect("tcp://localhost:8022"); 
$receiver2 = new ZMQSocket($context, ZMQ::SOCKET_PULL); 
$receiver2->connect("tcp://localhost:8024"); 

for (;;) { 
    echo $receiver->recv() . PHP_EOL; 
    echo $receiver2->recv() . PHP_EOL; 
} 

cnt.php和cnt2.php(相同的代码,不同端口)

$context = new ZMQContext; 
$work = new ZMQSocket($context, ZMQ::SOCKET_PUSH); 
$work->bind('tcp://*:8022'); 
$work->send('Hello World'); 

cnt.php发送到8022和cnt2.php到8024.他们不时执行并发送消息给rep.php。但是,有些消息会卡住。如果我从cnt.php发送了4封邮件,没有收到任何邮件,但是当我从cnt2.php发送1封邮件时,我一次收到5封邮件。有任何想法吗?

+0

选择是暗示你可能真的离不开它 – pyfunc

+0

这其实并不重要。 =/ – vinnylinux

回答

1

我不是PHP专家,但猜测语法和功能。请纠正我,如果我错了

echo $receiver->recv() . ' - ' . $receiver2->recv(); 

recv()应该是阻塞呼叫。

  1. $receiver->recv()阻塞,直到收到一些消息。
  2. echo只有当你从其他的文件发送短信不回送立即
  3. 您再次受阻于$receiver2->recv()
  4. 消息确实回声工作,因为它是在$receiver2->recv()

等待既然你想要独立处理套接字recv(),您应该使用基于轮询或基于事件的异步I/O。

[尝试性解决方案]

$poll = new ZMQPoll(); 
$poll->add($receiver, ZMQ::POLL_IN); 
$poll->add($receiver2, ZMQ::POLL_IN); 
$readable = $writeable = array(); 
while(true) { 
    $events = $poll->poll($readable, $writeable); 
    foreach($readable as $socket) { 
       $message = $socket->recv(); 
       echo $message, PHP_EOL; 
    } 
} 

摘自:变量名的http://zguide.zeromq.org/php:rrbroker

+0

如果我回显$ receiver-> recv()然后echo $ receiver2-> recv()会怎么样? – vinnylinux

+0

rep.php不是脚本,它一直在运行,等待接收消息。 – vinnylinux

+0

我改变了行为,消息仍然卡住。检查我的编辑。 – vinnylinux