2011-03-07 27 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

相关问题