2012-06-22 130 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