2011-03-07 184 views
0

我正在使用RabbitMQ爲使用PHP AMQP extension的搜索索引器進程實施工作任務隊列。我需要搜索索引器demon來偵聽隊列中的消息,並在消息可用時使用它們。你如何在PHP中同步偵聽來自RabbitMQ隊列的消息?

我看到從隊列中消費內容的兩種方法:

  • AMQPQueue ::讓 - 不阻塞,因此,可能不是我追求的
  • AMQPQueue ::消耗 - 很有前途

但是,使用消耗似乎會設置一個消費者,然後不會被刪除。這裏的PHP:

$opts = array('min' => 1, 'max' => 10, 'ack' => false); 
$messages = array(); 
while (count($messages) or $messages = $q->consume($opts)) { 
    $msg = array_pop($messages); 
    var_dump($msg); 
    // ...Do work here... 
    $q->ack($msg['delivery_tag']); 
} 

而且你可以看到消費者建立使用rabbitmqctl:

[[email protected] ~] rabbitmqctl list_queues name consumers 
Listing queues ... 
test_queue 3 
[[email protected] ~] rabbitmqctl list_queues name consumers 
Listing queues ... 
test_queue 4 

所以,問題是,什麼是一個PHP後臺程序綁定到隊列中,使得它的正確方法在等待消息可用時阻止,並在完成與每個消息批次相關聯的工作時再次開始阻止/偵聽?

+0

在利益的情況下,我最終切換到魔豆,這是做的工作對我來說非常漂亮。 – Andrew 2011-12-14 18:39:49

回答

2

我不確定PHP Pecl擴展如何實現消費者,但是我的Amqp庫允許您通過調用函數來收聽傳入消息(即消耗),並且有幾種可用的「退出策略」如果你不想永遠阻止。有documentation available here,請查看「實施消費者」一節以及demo script

+0

謝謝你。我看過你的圖書館,而且教程非常好,但它似乎沒有任何參考文檔。也許庫中的所有可用元素都用於演示中,但我完全依靠逆向工程演示而感到有點緊張。例如,我喜歡一次使用多個消息的概念,即PECL擴展通過最小和最大選項提供的概念。你的文檔引用了調用basic.qos,但很難弄清楚我將如何實現一個多消息接收器類。 – Andrew 2011-03-13 09:38:57

+0

@Andrew我已經提出了這個問題+50賞金。請看看你是否可以幫助 - http://stackoverflow.com/questions/9151698/does-rabbitmq-call-the-callback-function-for-a-consumer-when-it-has-some-message – 2012-02-18 21:41:26

相關問題