【问题标题】:Best practices for running a PHP cronjob continuously连续运行 PHP cronjob 的最佳实践
【发布时间】:2012-01-07 12:39:00
【问题描述】:

我需要连续运行一些任务。这些任务主要包括从数据库中检索特定记录、分析和保存它们。这是一个重要的分析,可能需要几秒钟(也许超过一分钟)。 我不知道新记录多久会保存在数据库中等待分析(还有另一个 cronjob)。

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

【问题讨论】:

  • 数据库触发器怎么样?
  • 我需要在 PHP 上运行一些代码来执行分析。我不认为它可以纯粹在数据库上完成。
  • 您可能想尝试将您的代码发布到codereview.stackexchange.com,看看是否有人可以查看它并告诉您您可能需要记住的内容。

标签: php cron


【解决方案1】:

作业队列服务器可能适用于这种情况(例如,参见 ActiveMQMemcacheQ。与其将未分析的记录直接添加到数据库中,不如将它们发送到队列进行处理。然后您的 cron 作业可以从队列中检索一些项目进行处理,如果一个作业需要很长时间才能运行,则再次触发 cron 作业,下一个将运行并获取队列中的下一个项目。

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

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    那个。您必须首先进行一些试验和错误指标来确定最佳fixed amount

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

    您最好使用安全的方法,即使这意味着在 cron 执行之间会浪费一点时间。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 2016-09-13
        • 2018-04-10
        • 2015-03-25
        • 2015-10-12
        相关资源
        最近更新 更多