我有一个应该一直运行的“生产者”,但是似乎经过一天左右的时间,它仍然能够向先前声明的队列发送消息,但是当尝试声明一个新队列时,它炸毁:
'PhpAmqpLib\Exception\AMQPHeartbeatMissedException' with message 'Missed server heartbeat' in /php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/AbstractIO.php:140
我认为心跳仅适用于消费者(因为没有地方检查生产者的心跳)?当我不是“消费者”时是否正在检查心跳是一个错误?
还是在我声明队列时,我的脚本也变成了“消费者”,因为它需要“消费”来自服务器的反馈,表明该队列已准备就绪或可以使用?
当前设置的方式,我可以定期使用什么解决方法来检查queue_declare
是否在运行时会崩溃,所以当我确实需要运行queue_declare
时,它不会意外炸毁?
我在最新版本(2.9.2)上使用AMQPSSLConnection
,并且$connection->isConnected()
一直在返回true
。心跳设置为15秒。
答案 0 :(得分:1)
事实证明,php-amqplib
的下一个次要版本将添加一种方法:$connection->checkHeartBeat();
(在我发布此问题前几天,它就提交给了项目仓库)。定期拨打此电话即可解决问题。
与此同时,定期调用$connection->wait(null, true);
也是可行的解决方案。