0

我有一个使用 php-amqplib 的 php 守护程序,它使用来自 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 个消费者,但进程仍在以某种方式运行。

4

1 回答 1

1

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

于 2021-07-22T09:12:00.953 回答