PHP Amqp通道回调循环

时间:2017-03-21 16:51:20

标签: php php-amqplib

The example code for RabbitMQ

  

我们的代码会阻止我们的$ channel有回调。每当我们   接收消息我们的$ callback函数将通过收到   消息。

使用此代码段

while(count($channel->callbacks)) {
    $channel->wait();
}

这让我感到困惑,因为the default timeout for PhpAmqpLib\Channel\AbstractChannel::wait is forever

public function wait($allowed_methods = null, $non_blocking = false, $timeout = 0)

因此,如果wait永久阻止,代码将如何达到while循环的第二次迭代?

只有在while传递wait时才需要$timeout > 0循环才会安全吗?

2 个答案:

答案 0 :(得分:2)

wait调用的超时参数是放弃前等待下一条消息的时间。正如您所说,默认值是“永远”,这意味着“直到消息到达”。

但是,一旦收到并处理了一条消息,wait呼叫就会退出;它可能被命名为waitForNextEvent()。您可以在链接到的源中看到:

if ($this->should_dispatch_method($allowed_methods, $method_sig)) {
    return $this->dispatch($method_sig, $args, $amqpMessage);
}

因此,要接收多条消息,您需要多次拨打wait()。通常,在消费者中,您希望无限次地调用它,因此您可以使用while(true),但如果取消注册所有回调,则允许循环退出,这样可以优雅地退出。

答案 1 :(得分:0)

您显示的代码将代表AMQP消息的工作者或处理者

因为它将侦听来自AMQP服务器的丢弃消息,它将永远等待/侦听/循环这些消息。