限制运行PHP脚本的cron作业数

时间:2010-05-11 18:31:12

标签: php cron

我每天都有一个cron工作,一次抓住10个用户,然后用它们做一堆东西。每天有1000个用户参与该过程。我不希望cron作业重叠,因为它们在服务器负载上很重。他们从各种API调用东西,所以我有超时和慢速数据提取来应对。

我尝试使用标记将cron作业标记为正在运行,但由于某些PHP脚本可能以各种方式超时或失败,因此它不够可靠。

是否有一种很好的方法可以阻止cron作业多次调用PHP脚本,或者控制调用它的次数,所以例如只有3个实例?

如果可能,我更喜欢PHP中的解决方案。

目前我将标志存储为数据库中的值,是否正在使用锁定类型文件,如此处https://stackoverflow.com/questions/851872/does-a-cron-job-kill-last-cron-execution更好?

4 个答案:

答案 0 :(得分:3)

我使用了一种通过数据库中的表跟踪正在执行的脚本数量的脏方法。已启动的脚本会插入一行id和字段started_time。退出时,它会删除他的行。太旧的行被视为“失败的\死脚本”。

cron不直接启动工作程序脚本。 Cron每隔1秒左右启动一次“启动器脚本”,检查表中是否有活跃的工人数量,并在需要时产生更多工人。

这样的计划已经在线为我工作了2。5年。只需抓住一些不断更新的内容。

答案 1 :(得分:1)

我遇到了类似的问题,最后编写了自己的小守护进程,因为它似乎是最简单的解决方案。

答案 2 :(得分:0)

如果您具有从shell运行脚本的命令行访问权限,我倾向于编写类似我在How feasible is a daemon written in PHP, using ignore_user abort and set_time_limit(0)中描述的脚本 - 以及链接到的博客文章。在那个答案中,我描述了一个处理数据的长期运行的PHP脚本。如果/当它退出时,包含的bash脚本会重新启动它,以便它可以完成它的工作。

当PHP脚本确定它已完成当天的所有工作时,它会计算需要再次运行的秒数,然后只需调用sleep($howLongToWaitTillRunAgain);

答案 3 :(得分:0)

您可以使用Fat Controller重复运行脚本。与CRON不同,只要脚本的一个实例结束,它就可以再次运行另一个脚本实例。

您还可以从脚本中提供当前没有其他任何事情要做的反馈,Fat Controller将在再次运行脚本之前暂停一段时间。

如果你真的很冒险,你甚至可以让胖控制器并行运行脚本的多个实例,如果队列真的满了,但这不是你想要的。

www.4pmp.com/fatcontroller/