持续运行PHP cronjob的最佳实践

时间:2011-11-27 21:43:55

标签: php cron

我需要不断地执行一些任务。这些任务主要包括从数据库中检索特定记录,分析和保存它们。这是一个非平凡的分析,可能需要几秒钟(也许超过一分钟)。 我不知道在等待分析的数据库中保存新记录的频率是多少(还有另一个cronjob)。

一旦完成(递归),我是否应该逐一检索相同的分析函数并尝试保持cronjob运行直到没有更多未分析的记录? 或者我应该在每个cronjob运行中检索固定数量的新记录,并且每隔一定的分钟数来调用cronjob?

3 个答案:

答案 0 :(得分:6)

作业队列服务器可能适用于此场景(例如,请参阅ActiveMQMemcacheQ。不要将未分析的记录直接添加到数据库,而是将它们发送到队列进行处理。然后你的cron作业可以从队列中检索一些项目进行处理,如果一个作业运行这么长时间再次触发cron作业,则下一个作业将运行并获取队列中的下一个项目。

就个人而言,我会让cron作业检索固定数量的记录进行处理,只是为了确保在新记录不断添加并且处理器可以添加的情况下很长时间没有让脚本卡住处理跟不上。最终它可能会完成所有事情,但最终可能会持续很长一段时间。

您可以考虑创建一个锁定文件,该作业可以查找该任务处理器是否已在运行。例如,当cron作业启动时,检查是否存在文件(例如processor.lock),如果存在则退出,如果不存在,则退出,创建文件,处理一些记录,然后删除文件。

希望有所帮助。

答案 1 :(得分:1)

  

或者我应该在每次cronjob运行中检索固定数量的新记录,并在每隔一定时间内调用cronjob?

这。您必须首先执行一些试验和错误指标才能确定最佳fixed amount

当然,它在很大程度上取决于您实际在做什么,您同时运行多少个数据库密集型cron作业以及您拥有什么样的设置。我最近花了一天时间在一个非常密集的脚本中寻找一个Heisenbug,它将图像从db迁移到s3(并在迁移时创建了一些拇指)。问题是由于我们的ORM中存在未记录的行为,因此在某些时候丢失了与数据库的连接,因为对于某些图像发布s3 + thumb生成比连接时间限制多一点。这是一个丑陋的情况,在递归中确定所有方案可能花费超过一天的时间。

使用安全方法会更好,即使这意味着在执行cron之间会有一点时间丢失。

答案 2 :(得分:0)

我将使用The Fat Controller来运行和重复任务,而不是使用cron作业。它基本上是一个守护进程,它可以运行任何脚本或应用程序,并在完成后重新启动它,可选择在运行之间延迟。

您还可以指定超时,以便停止长时间运行的脚本。这样您就不需要关心锁定,长时间运行的进程,错误进程等等。它将有助于保持您的业务逻辑清洁。

网站上有更多示例和用例:

http://fat-controller.sourceforge.net/