【问题标题】:PHP: How to use cron (or another method) to get a PHP script to run every second?PHP:如何使用 cron(或其他方法)让 PHP 脚本每秒运行一次?
【发布时间】:2013-04-02 17:41:58
【问题描述】:

如果我有一个每分钟运行一次的 cron 作业,并且第一次迭代运行 62 秒,那么第二次迭代会等到第一次出现结束,还是会发生相同的 cron 作业同时运行?

为了说明这一点,请参见场景 1:

|0    |60   |120  |180  |240  |300
------ Cron Job 1 Taking 60 Seconds
      --------- Cron Job 2 Taking 90 Seconds
            ------ Cron Job 3 Taking 90 Seconds but overlapping with the previous cron job

以上是会发生什么,还是场景2会发生:

|0    |60   |120  |180  |240  |300
------ Cron Job 1 Taking 60 Seconds
      --------- Cron Job 2 Taking 90 Seconds
               XXX-------Cron Job 3 waiting til the next 1 minute interval starts

我担心会有一段 30 秒标记为 XXX 的时间段不会运行任何 cron 作业。

我想要完成什么?我想无限期地每秒执行一个 PHP 脚本。它不必每秒运行一次,但它必须运行、结束、运行、结束、运行、结束。如果一个迭代需要 5 秒,它只能在第一个结束后开始下一个。但它绝不能停止。问题是我无法确定迭代的长度。一次迭代可能需要 1 秒,也可能需要 5 秒,甚至更长。

  1. cron 可以做到这一点吗?这样我就可以保证脚本无论如何都会每秒运行一次?
  2. 如果不是,我如何保证 PHP 脚本一次又一次地无限期地运行?

【问题讨论】:

    标签: php cron


    【解决方案1】:

    不管另一个实例如何,它都会启动第二个进程。在您的脚本中,您可以检查是否有其他进程(例如,如果全局 PID 文件存在)已经在运行或其他什么,这取决于您确切需要什么。

    【讨论】:

      【解决方案2】:

      是的。 cron 启动作业,但不检查先前启动是否已完成。它没有管理任何作业队列。

      【讨论】:

        【解决方案3】:

        第二次迭代会开始直到第一次出现结束吗?

        对于大多数 Unix 系统默认的 Vixie cron,答案是“是”。

        如何在执行 PHP 脚本的 Linux 系统上获得真正的每秒间隔?

        这个问题很奇怪,请重新表述。但是,如果您希望每个脚本的单个实例同时运行,请使用 /usr/bin/flock 或任何其他互斥工具。

        【讨论】:

          【解决方案4】:

          我最终使用了supervisord,它解决了我所有的问题。

          【讨论】:

            【解决方案5】:

            你可以实现一个简单的锁定机制如下。

            if(!locked()) {
                lock();
                // your code here
                unlock();
            } else {
                echo "script already running";
            }
            
            function lock()   { file_put_contents("write.lock", 'running'); }
            function locked() { return file_exists("write.lock"); }
            function unlock() { return unlink("write.lock"); }
            

            【讨论】:

              【解决方案6】:

              您可能会考虑“守护”您的脚本,而不是使用 cron:PEAR System Daemon

              从那里开始,您似乎需要构建一个简单的作业/任务/工作队列,并使用守护程序进行相应的调度和锁定。

              【讨论】:

                猜你喜欢
                • 2014-09-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-02-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-03-06
                相关资源
                最近更新 更多