【问题标题】:Using xdebug in PHP AMQPQueue::consume()在 PHP AMQPQueue::consume() 中使用 xdebug
【发布时间】:2015-12-11 18:43:08
【问题描述】:

我们正在使用 RabbitMQ,并希望在消费者内部使用 xdebug。我们使用AMQPQueue 来监听队列中的消息。我最多可以使用 xdebug 到AMQPQueue::consume(),但是一旦调用了consume(),我就无法获得断点。任何帮助都会很棒。

【问题讨论】:

    标签: php rabbitmq xdebug amqp php-amqp


    【解决方案1】:

    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 执行线程,因此看起来应用程序正在挂起。

    【讨论】:

    • 我试过这个。但是一旦进入循环,我的断点就无法识别。
    • xdebug 断点是否在该回调之外工作?您可以发布一些带有断点位置的示例代码来演示您的确切问题吗?
    • 我可以在外面放置一个断点,如果我尝试进入 consume() 方法,我的调试会话会冻结。我可以尝试稍后发布代码示例,但由于代码库的大小,这很难做到。
    • 查看答案中的最后一句:“当通道上没有消息时,consume() 函数将运行并阻塞主 PHP 执行线程,因此看起来应用程序正在挂起。”。或者,将调试输出添加到回调函数并以正常模式(无调试)运行应用程序并查看它是否被实际调用。但首先检查您正在消费的队列中是否有任何消息。
    • 所以我测试这个的方法是在我想要停止的函数中添加一个断点。然后我进入我们的 UI 并开始一个将消息推送到 RabbitMQ 的操作。当消费者运行时,我们的 UI 通过 XMPP 更新。我可以看到 UI 会更新并且断点从未被触发。断点周围的日志语句可确保执行带有断点的代码。你曾经在 RabbitMQ 消费者中使用过断点吗?
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多