PHP RabbitMQ 消费者停止消费事件

PHP RabbitMQ consumer stops consuming events

我有一个 php 守护进程,它使用 php-amqplib,它使用来自 RabbitMQ 服务器的消息。这是它的要点(尽管它比那复杂一点):

$callback = function (AMQPMessage $msg) {
    echo "Handling event: some event name here";
    try {
      //some custom logic here
    } catch (\Throwable $e) {
      //write error in a log here
    }
    
    $msg->ack();
};

$channel = $this->connection->channel();
$channel->basic_qos(null, 1, null);

$channel->basic_consume($queue, '', false, false, false, false, $callback);

$this->wait($channel);

while ($channel->is_open()) {
   $channel->wait();
}

$channel->close();
$this->connection->close();

当我 运行 它在后台时,它处理事件,将输出和错误写入各种日志,我可以在 RabbitMQ 控制面板中看到队列有消费者。然后在相当长的一段时间后它就停止了:错误和输出日志中都没有消息出现,RabbitMQ 控制面板显示队列有 0 个消费者,但是这个过程仍然 运行 不知何故。

如果进程继续运行,但没有收到来自 rabbitMQ 的事件,这可能是由于消费者和 rabbit 服务器之间的连接丢失造成的。可能连接被服务器关闭了。默认情况下,如果 rabbitMQ 服务器在某个有意义的超时(取决于配置)内没有收到来自消费者的 ack 信号,它认为消费者已经死了,关闭连接并重新排队消息。 IE。如果消息处理需要很长时间并且您的消费者没有在此超时内发送确认,则连接丢失。 要解决此问题,您可以向服务器发送所谓的“心跳”,比如“嘿,我还活着,请给我更多时间来处理消息”。 RabbitMq 客户端应该会自动执行此操作,但 php 实现中存在一些错误。详情请看这篇文章:https://blog.mollie.com/keeping-rabbitmq-connections-alive-in-php-b11cb657d5fb