The example code for RabbitMQ states
Our code will block while our $channel has callbacks. Whenever we receive a message our $callback function will be passed the received message.
With this code snippet
while(count($channel->callbacks)) {
$channel->wait();
}
This confuses me, because the default timeout for PhpAmqpLib\Channel\AbstractChannel::wait
is forever.
public function wait($allowed_methods = null, $non_blocking = false, $timeout = 0)
So if wait
blocks forever, how would the code ever reach a second iteration of the while
loop?
Would it be safe to say the while
loop is only necessary if wait
is passed a $timeout > 0
?
the code you are showing, would represent the worker or processor of the AMQP messages
Because it will listen for dropped messages from the AMQP server, it will be waiting/listening/looping forever for these messages.
The timeout parameter on the
wait
call is how long to wait for the next message before giving up. The default value, as you say, is "forever", which means "until a message arrives".However, once a single message has been received and processed, the
wait
call exits; it could perhaps be namedwaitForNextEvent()
. You can see that in the source you linked to:So to receive more than one message, you need to call
wait()
more than once. Generally, in a consumer, you want to call it an infinite number of times, so you could just usewhile(true)
, but allowing the loop to exit if you unregister all your callbacks gives you a way of gracefully exiting.