我每天都有一个cron工作,一次抓住10个用户,然后用它们做一堆东西。每天有1000个用户参与该过程。我不希望cron作业重叠,因为它们在服务器负载上很重。他们从各种API调用东西,所以我有超时和慢速数据提取来应对。
我尝试使用标记将cron作业标记为正在运行,但由于某些PHP脚本可能以各种方式超时或失败,因此它不够可靠。
是否有一种很好的方法可以阻止cron作业多次调用PHP脚本,或者控制调用它的次数,所以例如只有3个实例?
如果可能,我更喜欢PHP中的解决方案。
目前我将标志存储为数据库中的值,是否正在使用锁定类型文件,如此处https://stackoverflow.com/questions/851872/does-a-cron-job-kill-last-cron-execution更好?
答案 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将在再次运行脚本之前暂停一段时间。
如果你真的很冒险,你甚至可以让胖控制器并行运行脚本的多个实例,如果队列真的满了,但这不是你想要的。