在长时间运行的后台脚本中处理doctrine 2连接

时间:2014-12-01 08:13:25

标签: mysql symfony doctrine-orm rabbitmq

我正在运行PHP命令行脚本作为需要连接到MySQL数据库的rabbitmq使用者。这些脚本使用Symfony2 commands ORM以Doctrine2运行,这意味着在后台处理打开和关闭数据库连接。 当cli命令退出时,连接通常会自动关闭 - 根据定义,这在后台使用者中很长时间没有发生。

当消费者空闲(没有传入消息)长于MySQL服务器配置中的wait_timeout设置时,这是一个问题。如果消息的消耗时间不超过该时间段,则数据库服务器将关闭连接,下一条消息将失败并显示MySQL server has gone away异常。

我已经考虑过这个问题的两个解决方案:

  1. 在每封邮件之前打开连接,并在处理完邮件后手动关闭连接。
  2. 实现ping消息,该消息每n分钟运行一次虚拟SQL查询,如SELECT 1 FROM table,并使用cronjob调用它。
  3. 第一种方法的问题是:如果该队列上的流量很高,则消费者在打开/关闭连接时可能会有很大的开销。第二种方法听起来像是一个丑陋的黑客来处理这个问题,但至少我可以在高负载时使用单个连接。

    有没有更好的解决方案来处理后台脚本中的学说连接?

3 个答案:

答案 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)

我的方法有些不同。我的工人只处理一条消息,然后死亡。我已将主管配置为每次都创建新工作人员。因此,工人将:

  1. 询问新消息。
  2. 如果没有消息,请睡眠20秒钟。如果不是,主管将认为出了点问题,并停止创造工人。
  3. 如果有消息,请对其进行处理。
  4. 也许,如果处理一条消息的速度非常快,出于与2相同的原因入睡。
  5. 处理完消息后,只需完成

使用AWS SQS效果很好。

欢迎发表评论。