我应该使用消息队列吗?

时间:2011-02-18 20:37:56

标签: php message-queue

我有一个PHP应用程序,目前有5k用户,并将在可预见的未来继续增加。每周一次我运行一个脚本:

  • 从数据库中提取所有用户
  • 遍历用户,并为每个用户执行一些维护(这包括添加新的DB记录)

此脚本最后一次运行时,由于30秒的最大执行时间错误,它在死亡前仅处理了1400个用户。我想到的一个解决方案是让主脚本仍然获取所有用户,但是它不会执行维护过程本身,而是对一个新脚本进行异步cURL调用(每个用户1个),该脚本将为该脚本执行维护。特别是用户。

我担心的是5k + cURL调用可能会导致服务器崩溃。这可以通过使用消息队列而不是cURL调用来解决吗?我没有使用过的经验,但从我看过的内容看起来似乎有帮助。如果是这样,你会推荐哪种消息排队系统?

一些背景信息:

  • 这是一个Symfony项目,使用Doctrine作为我的ORM,MySQL作为我的DB
  • 服务器是Windows机器,我正在使用Windows的任务调度程序,并且wget每周自动运行一次此脚本。

非常感谢任何建议和帮助。

5 个答案:

答案 0 :(得分:2)

如果可能的话,我会做一个更频繁运行的计划任务(cron作业)并使用LIMIT 100(或其他一些号码)一次处理有限数量的用户。

答案 1 :(得分:2)

一些想法:

  1. 增加脚本执行时间限制 - set_time_limit()
    不要过火,但超过30秒将是一个开始。
  2. 跟踪维护用户
    也许为每个用户last_check添加一个字段,并将该字段设置为针对该用户执行的上一次成功“保养”操作的日期/时间。
  3. 处理较小批次
    最好经常运行较小的批次。可以把它想象成“相当于”不止一个篮子里的所有鸡蛋“的PHP。使用上面的last_check字段,可以轻松识别自上次更新以来时间最长的字段,并设置处理频率的阈值。
  4. 经常运行
    设置一个cronjob和进程,比如说每2分钟就有100条记录或类似的东西。
  5. 记录并查看您的效果
    有日志文件和记录统计信息。处理了多少条记录,自上次处理以来有多长时间,脚本需要多长时间。这些指标将允许您调整批量大小,cronjob设置,时间限制等,以确保以稳定的方式执行最大化检查。
  6. 与单个流程相比,设置所有这些可能听起来像很多工作,但它可以让您处理增加的用户量,并为您可能在轨道上看到的任何进一步维护任务奠定坚实的基础。 / p>

答案 2 :(得分:1)

为什么你还没有使用cURL的想法,而是只为每个用户处理一个用户,将一堆用户分成1000个或更多的组。

答案 3 :(得分:0)

您是否考虑过更改逻辑以在处理每个用户时提交更改?听起来您可能正在运行单个事务来处理所有用户,这可能不是必需的。

答案 4 :(得分:0)

如何增加PHP的执行时间限制?

此外,考虑是否可以改善维护程序以使其更快也可以提供帮助。根据你究竟在做什么,你也可以考虑将它扩散一点。偶尔做一对,而不是一次做所有人。但取决于你当然在做什么。