2011-02-18 75 views
1

我有一个PHP应用程序,目前有5k用户,并将继续增加为可预见的未来。每周一次我运行一个脚本:我应该使用消息队列吗?

  • 通过用户获取所有用户数据库
  • 循环,并执行每一个一定的维修费用(包括添加新的数据库记录)

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

我的问题在于,5k + cURL调用可能会导致服务器关闭。这是可以通过使用消息队列而不是cURL调用来解决的吗?我没有使用过的经验,但从我读过的内容看来,这可能会有所帮助。如果是这样,你会推荐哪个消息队列系统?

一些背景资料:

  • 这是一个Symfony的项目,使用Doctrine作为我ORM和MySQL作为我的数据库
  • 服务器是Windows机器,而我使用的是Windows的任务调度程序和wget每周自动运行一次该脚本。

任何意见和帮助,非常感谢。

回答

2

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

0

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

+0

当我循环遍历所有用户时,每个用户都使用单独的SQL查询保存数据库记录。这是你在'处理每个用户时提交更改'的含义吗? –

0

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

此外,看看你是否可以改善你的维护程序,使其更快,也可以帮助。根据你在做什么,你也可以考虑分散一点。偶尔做一次情侣,而不是一次做一次。但取决于你当然在做什么。

1

为什么你仍然不使用cURL的想法,而是只为每个用户处理一个用户,而是通过将用户分成1000个或更多组来将一群用户发送到一个用户。

2

几个想法:

  1. 增加脚本执行时间限制 - set_time_limit()
    不要太过火,但超过30秒将是一个开端。
  2. 轨道保养针对用户
    也许增加一个字段为每个用户,last_check并具有字段设置为最后的成功的“保养”针对该用户进行操作的日期/时间。
  3. 工艺小批量
    更好地运行更小的批次更经常。把它看作是PHP的“等于你所有的鸡蛋在一个以上的篮子里”。通过上面的last_check字段,可以很容易地识别自上次更新以来持续时间最长的那些字段,并设置处理这些字段的频率的阈值。
  4. 运行更加频繁
    设置一个cronjob和进程,比如每2分钟记录100条记录或类似的东西。
  5. 记录和检查你的性能
    有日志文件和记录统计。处理了多少记录,自上次处理多长时间以后,剧本花了多长时间。这些指标将允许您调整批量大小,cronjob设置,时间限制等,以确保最大限度的检查以稳定的方式执行。

与单个进程相比,设置所有这些可能听起来像很多工作,但它可以让您处理增加的用户量,并且可以为任何您可能正在查看的进一步维护任务奠定坚实的基础。跟踪。