如何在PHP中同步侦听来自RabbitMQ队列的消息?

时间:2011-03-07 17:44:03

标签: php messaging rabbitmq amqp

我正在使用RabbitMQ使用PHP AMQP extension为搜索索引器进程实现工作组任务队列。我需要搜索索引器恶魔来侦听队列中的消息,并在它可用时使用它们。

我看到两种消耗队列内容的方法:

  • AMQPQueue :: get - 不阻止,所以可能不是我追求的
  • AMQPQueue :: consume - 似乎很有希望

但是,使用消费似乎会设置一个不会被删除的消费者。这是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构建:

[andrew@localhost ~] rabbitmqctl list_queues name consumers
Listing queues ...
test_queue   3
[andrew@localhost ~] rabbitmqctl list_queues name consumers
Listing queues ...
test_queue   4

所以问题是,将PHP守护程序绑定到队列以使其在等待消息可用时阻塞的正确方法是什么,并在完成与每条消息关联的工作时再次开始阻塞/侦听批次?

2 个答案:

答案 0 :(得分:2)

我不确定PHP Pecl扩展如何实现消费者,但是我的Amqp库允许您通过调用函数来监听传入消息(即消费),并且有几个“退出策略“以防万一你不想永远阻止。有documentation available here,请查看“实施消费者”部分,并在此处查看demo script

答案 1 :(得分:0)

消费是你想要的。它会阻止,直到收到消息。

自您的代码以来,API已经发生了很大变化,因此很难猜出出了什么问题。

http://www.php.net/manual/en/amqpqueue.consume.php

有半最新文档和示例