函数检查是否已经为cron执行了php

时间:2012-01-18 05:36:55

标签: php cron

Ealier我在一个单独的文件中使用了函数,可以通过脚本调用cron。

function processExists($file = false) {

   $exists     = false;
   $file       = $file ? $file : basename(__FILE__);

   $command = "ps -ef | grep -v grep | grep $file";
   exec($command, $pids);
   if (count($pids) > 1) {
      $exists = true;
   }
   return $exists;
}

它可以从任何PHP脚本执行:

if (processExists(basename(__FILE__))) {
   echo 'Process in already running ';
   exit(0);
}

由于某种原因,它在Debian6中不起作用。 现在我在每个脚本的开头添加:

$fh = fopen(__FILE__, 'r');
if (!flock($fh, LOCK_EX | LOCK_NB)) {
   echo 'Script is already running!!!' . "\n";
   exit(0);
}

它导致我尝试在单独的文件中创建函数的每个脚本中的代码重复,以便在需要时从任何PHP脚本调用,例如:

function stopIfRunning($file)
{
    $fh = fopen($file, 'r');
    if(!flock($fh, LOCK_EX | LOCK_NB)) {
        echo 'Script is already running!!!' . "\n";
        exit(0);
    }
}

从php脚本调用:

stopIfRunning(__FILE__);

但在这种情况下它不起作用。你能解释为什么它在这种情况下不起作用吗?

3 个答案:

答案 0 :(得分:1)

如果您需要确保服务正在运行,请使用Daemontools或Monit。

就个人而言,如果需要自定义实现,我会使用普通的Bash,而不是PHP。

顺便说一句,您可以在终端中轻松调试ps命令。

答案 1 :(得分:0)

FILE 它是正在运行的文件的名称。

stopIfRunning(__FILE__);

function stopIfRunning($file)
{
    $fh = fopen($file, 'r');
    ....
}

在这里,您尝试打开此执行文件以进行锁定。

答案 2 :(得分:0)

似乎问题是在stopIfRunning函数上使用$ fh。如果带有functiona的文件改为:

$fh = null;
function stopIfRunning($file)
{
    global $fh;
    echo $file, "\n";
    $fh = fopen($file, 'r');
    if (!$fh) {
        echo 'Failed to open file', "\n";
    }
    if(!flock($fh, LOCK_EX | LOCK_NB)) {
        echo 'Script is already running!!!' . "\n";
        exit(0);
    }
}   

并在应该使用cron启动的文件中调用它:

stopIfRunning(__FILE__);

这里使用了全局变量,这并不好。如果有人提出没有全局变量的解决方案,那将会很棒。