PHP:如何使用cron(或其他方法)让PHP脚本每秒运行一次?

时间:2013-04-10 18:15:34

标签: php cron

如果我有一个每分钟运行一次的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

我担心的是,标记为XXX的时间段为30秒,无法运行cron作业。

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

  1. cron可以这样做吗?因此,无论如何,我都可以保证脚本每一秒运行一次?
  2. 如果没有,我怎么能保证PHP脚本无限期地运行,一次迭代一次?

6 个答案:

答案 0 :(得分:2)

您可以实现一个简单的锁定机制,如下所示。

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"); }

答案 1 :(得分:1)

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

答案 2 :(得分:0)

无论其他实例如何,它都会启动第二个进程。在您的脚本中,您可以检查已经运行的其他进程(例如,如果存在全局PID文件)或其他进程,具体取决于您的需求。

答案 3 :(得分:0)

  

第二次迭代是否会开始,直到第一次出现?

对于大多数Unix,默认使用Vixie cron,答案是“是”。

  

如何在执行PHP脚本的Linux系统上每秒获得一次真值?

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

答案 4 :(得分:0)

我最终使用supervisord来解决我的所有问题。

答案 5 :(得分:0)

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

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