【发布时间】:2015-12-11 18:43:08
【问题描述】:
我们正在使用 RabbitMQ,并希望在消费者内部使用 xdebug。我们使用AMQPQueue 来监听队列中的消息。我最多可以使用 xdebug 到AMQPQueue::consume(),但是一旦调用了consume(),我就无法获得断点。任何帮助都会很棒。
【问题讨论】:
标签: php rabbitmq xdebug amqp php-amqp
我们正在使用 RabbitMQ,并希望在消费者内部使用 xdebug。我们使用AMQPQueue 来监听队列中的消息。我最多可以使用 xdebug 到AMQPQueue::consume(),但是一旦调用了consume(),我就无法获得断点。任何帮助都会很棒。
【问题讨论】:
标签: php rabbitmq xdebug amqp php-amqp
AMQPQueue::consume(callable $callback = null, $flags = AMQP_NOPARAM, $consumerTag = null) 用 C (amqp_queue.c:816) 实现,当新消息出现 (amqp_queue.c:908) 在通道上时(就 AMQP 而言)调用回调函数 $callback (amqp_queue.c:963)。如果你在回调函数中设置断点,xdebug 将在回调函数被调用时停止。
在底层有无限循环阻塞套接字读取,它读取通道上的所有内容,如果是消息,则将其传递给回调。仅当发生某些异常(包括在回调中)和返回布尔值 false 时,该循环才会中断。
当通道上没有消息时,consume() 函数将运行并阻塞主 PHP 执行线程,因此看起来应用程序正在挂起。
【讨论】: