我正在运行PHP命令行脚本作为需要连接到MySQL数据库的rabbitmq使用者。这些脚本使用Symfony2 commands ORM以Doctrine2运行,这意味着在后台处理打开和关闭数据库连接。 当cli命令退出时,连接通常会自动关闭 - 根据定义,这在后台使用者中很长时间没有发生。
当消费者空闲(没有传入消息)长于MySQL服务器配置中的wait_timeout
设置时,这是一个问题。如果消息的消耗时间不超过该时间段,则数据库服务器将关闭连接,下一条消息将失败并显示MySQL server has gone away
异常。
我已经考虑过这个问题的两个解决方案:
ping
消息,该消息每n分钟运行一次虚拟SQL查询,如SELECT 1 FROM table
,并使用cronjob调用它。第一种方法的问题是:如果该队列上的流量很高,则消费者在打开/关闭连接时可能会有很大的开销。第二种方法听起来像是一个丑陋的黑客来处理这个问题,但至少我可以在高负载时使用单个连接。
有没有更好的解决方案来处理后台脚本中的学说连接?
答案 0 :(得分:2)
这是另一种解决方案。尽量避免长时间运行Symfony 2 Workers。由于执行时间长,它们总是会引起问题。内核不是为此而做的。
这里的解决方案是在真正的Symfony命令面前构建代理。所以每条消息都会触发一个新的Symfony内核。声音对我来说是一个很好的解决方案。
http://blog.vandenbrand.org/2015/01/09/symfony2-and-rabbitmq-lessons-learned/
答案 1 :(得分:0)
运行PHP-Scripts太长时间这是一个大问题。对我来说,最好的解决方案是重启脚本一次。您可以在此主题中看到如何执行此操作:How to restart PHP script every 1 hour?
您还应该运行消费者的多个实例。向任何一个添加计数器并在一些运行后终止它们。现在,您需要一个工具来确保一致的工作进程数量。这样的事情:http://kamisama.me/2012/10/12/background-jobs-with-php-and-resque-part-4-managing-worker/
答案 2 :(得分:0)
我的方法有些不同。我的工人只处理一条消息,然后死亡。我已将主管配置为每次都创建新工作人员。因此,工人将:
使用AWS SQS效果很好。
欢迎发表评论。