Network programming ZeroMQ中的卡住消息

Network programming ZeroMQ中的卡住消息,network-programming,message-queue,zeromq,Network Programming,Message Queue,Zeromq,我在ZeroMQ上遇到了一个奇怪的问题,其中一些消息被卡住,当新消息到达时就松开。这就像新的信息推门上卡住的信息(可怕的比较,我知道) 我的代码非常简单: rep.php $context = new ZMQContext; $receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL); $receiver->connect("tcp://localhost:8022"); $receiver2 = new ZMQSocket($context

我在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(相同的代码,不同的端口)


cnt.php发送到8022,cnt2.php发送到8024。它们不时地被执行,并向rep.php发送消息。但是,有些消息被卡住了。如果我从cnt.php发送了4条消息,没有收到任何消息,但是当我从cnt2.php发送1条消息时,我一次收到5条消息。有什么想法吗?

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

echo $receiver->recv() . ' - ' . $receiver2->recv();
recv()应该是一个阻塞调用

  • $receiver->recv()
    阻塞,直到收到某条消息
  • 但是
    echo
    不会立即回显消息
  • 您在
    $receiver2->recv()上再次被阻止
  • 只有当您从另一个文件发送消息时,echo才起作用,因为它正在等待
    $receiver2->recv()
  • 由于要独立处理socket 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;
         }
    }
    

    改编自:

    变量名的选择很有启发性,您可以不使用它,但这并不重要=/如果我回显$receiver->recv(),然后回显$receiver2->recv(),会怎么样?rep.php不是一个脚本,它一直在运行,等待接收消息。我已经改变了行为,消息仍然会被卡住。检查我的编辑。@vinnylinux:我已经添加了关于如何更改red.php的注释。看到它可能有PHP错误,因为我不知道PHP。我还添加了应该有用的指针
    $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;
         }
    }