2010-05-11 131 views
0

我有一个每日抓取10个用户的日常cron作业,并且与他们做了一堆事情。每天有1000名用户参与该流程。我不希望cron作业重叠,因为它们在服务器负载上很重。他们从各种API调用东西,所以我有超时和缓慢的数据提取来应付。限制运行PHP脚本的cron作业的数量

我试过使用一个标记来标记一个cron作业正在运行,但它不够可靠,因为一些PHP脚本可能会以各种方式超时或失败。

有没有一种很好的方法来阻止多次调用PHP脚本的cron作业,或者控制被调用的次数,因此只有3个实例是例如?

如果可能的话,我宁愿在PHP的解决方案。

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

回答

3

我使用了一种肮脏的方式来跟踪通过数据库中的表执行的脚本数量。启动的脚本将插入一行,其中包含id和字段started_time。在退出时,它删除了他的行。太旧的行被认为是“失败\死脚本”。

工作脚本不直接由cron启动。 Cron每隔1秒左右发布一次“启动脚本”,它会检查表格中活动工作人员的数量,并在需要时产生更多工作人员。

这样的计划已经为我工作了2.5年。只是抓住一些不断更新的内容。

+0

我一直在寻找跟踪pid的。我现在还在储存开始时间,所以如果它适合你,我会试试看,谢谢! – ed209 2010-05-11 18:56:11

1

我有一个类似的问题,并最终编写我自己的小守护程序,因为它似乎是最简单的解决方案。

0

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

当PHP脚本已经决定,它已经完成了所有的这一天的工作,它计算多少秒,直到它需要再次运行,然后只需调用sleep($howLongToWaitTillRunAgain);

0

你可以用肥胖控制器反复运行一个脚本。与CRON不同的是,只要一个实例结束,它就可以再次运行脚本的另一个实例。

您还可以从脚本提供反馈,目前没有其他任何操作,并且在再次运行脚本之前,胖控制器会休眠一段时间。

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

www.4pmp.com/fatcontroller/