【问题标题】:Limit the number of cron jobs running a PHP script限制运行 PHP 脚本的 cron 作业的数量
【发布时间】:2011-02-18 07:06:13
【问题描述】:

我有一个每日 cron 工作,一次抓取 10 个用户,并与他们一起做很多事情。每天有 1000 名用户参与该流程。我不希望 cron 作业重叠,因为它们对服务器负载很重。他们从各种 API 调用东西,所以我有超时和缓慢的数据获取来应对。

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

有没有什么好的方法可以阻止cron作业多次调用PHP脚本,或者控制它被调用的次数,所以例如只有3个实例?

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

目前我将标志作为值存储在数据库中,使用锁类型文件是否更好,就像这里 https://stackoverflow.com/questions/851872/does-a-cron-job-kill-last-cron-execution 一样?

【问题讨论】:

    标签: php cron


    【解决方案1】:

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

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

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

    【讨论】:

    • 我一直在关注跟踪 pid。我目前也在存储开始时间,所以如果它适合你,我会试一试,谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以使用胖控制器重复运行脚本。与 CRON 不同,它可以在脚本的一个实例结束时再次运行另一个脚本实例。

        您也可以从脚本中反馈目前没有其他事情可做,胖控制器会在再次运行脚本之前休眠一段时间。

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

        www.4pmp.com/fatcontroller/

        【讨论】:

          猜你喜欢
          • 2018-06-11
          • 1970-01-01
          • 2020-02-28
          • 2018-07-30
          • 1970-01-01
          • 1970-01-01
          • 2011-05-10
          • 2017-01-06
          • 1970-01-01
          相关资源
          最近更新 更多