【问题标题】:handling concurrency in cron php在 cron php 中处理并发
【发布时间】:2014-11-08 23:23:32
【问题描述】:

我正在设置一个每分钟执行一个脚本 page.php 的 cron 作业 我想知道并发性。 脚本自己需要 15 分钟才能完成,那么 cron 将如何运行?

Lets take a time frame of 15 minutes, how many crons will run in that time? 1 or 15?

will cron runs till its completion or it can be interrupted?

Thanks.

【问题讨论】:

    标签: php amazon-web-services amazon-ec2 cron jobs


    【解决方案1】:

    当您通过 cron 启动 php 脚本时,它将一直运行,直到完成或超过执行时间。 无论最后一个脚本是否仍在运行,系统总是会启动一个新的脚本实例。

    如果您知道脚本运行了很长时间,您应该设置一个 bash 脚本来检查脚本是否已经在运行,如果不是,则仅启动 php 脚本。

    【讨论】:

      【解决方案2】:

      Cron 不会为您处理并发 - 您的脚本必须这样做。

      事实证明,这很容易,因为有一个简单的 PHP 操作,即原子操作:unlink()

      我们倾向于这样使用它:

      • 全局标志文件启用脚本
      • 主要的 cron 作业除了触摸计时器标志文件之外什么都不做
      • 每分钟,另一个 cron 作业启动工作脚本
      • 这个工作脚本在全局标志文件上尝试unlink()
      • 如果不成功(结果评估为 false),则退出(这样可以确保一次只运行一个实例)
      • 此工作脚本在计时器标志文件上尝试unlink()
      • 如果不成功(结果评估为假),它touch()es 全局标志文件并退出(这确保一次 cron 运行最多启动一个实例)
      • 现在运行
      • 完成后touch()es全局标志文件重启循环

      这样,会导致并发的 cron 运行以可记录的方式被忽略。

      【讨论】:

      • 这根本不是我的问题
      • 您可能会考虑编辑您的问题以更好地解释它 - 也许我不是唯一一个误解它的人?
      【解决方案3】:

      这取决于您的计划任务/cron 设置。您可以配置为启动 15 次 PHP 脚本,或者在上一个作业完成时启动它。
      您的计划任务/cron 可以被它自己、外部信号或您在计划任务/cron 中所做的配置中断(如果在 N 分钟内未完成,则停止作业......)
      希望有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        • 2012-03-13
        相关资源
        最近更新 更多