2013-04-10 62 views
0

如果我有一个每分钟运行一次的cron作业,并且第一次迭代运行62秒,第二次迭代是否会等待直到第一次发生结束,或者可能发生同一个cron作业同时运行?PHP:如何使用cron(或其他方法)让PHP脚本每秒运行一次?

为了说明这一点,看到的场景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脚本无限期运行,一个接一个迭代?

回答

0

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

1

是的。 cron开始工作,但不检查以前是否开始完成。这不是管理任何工作队列。

0

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

使用Vixie cron是大多数Unix的默认设置,答案是“是”。

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

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

+0

我已更新我的问题 – coderama 2013-04-10 18:50:19

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

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

从那里,好像你就那么需要构建一个简单的工作/任务/工作队列,并使用守护进程相应地调度和锁定。