一尘不染

如何防止PHP脚本多次运行?

linux

目前,我试图阻止onlytask.php脚本多次运行:

$fp = fopen("/tmp/"."onlyme.lock", "a+");
if (flock($fp, LOCK_EX | LOCK_NB)) {
  echo "task started\n";
  //
    while (true) {
      // do something lengthy
      sleep(10);
    }
  //
  flock($fp, LOCK_UN);
} else {
  echo "task already running\n";
}
fclose($fp);

并且有一个cron作业每分钟执行一次以上脚本:

* * * * * php /usr/local/src/onlytask.php

它可以工作一段时间。几天后,当我这样做时:

ps auxwww | grep onlytask

我发现有 两个 实例正在运行!不是三个或更多,不是一个。我杀死了其中一个实例。几天后,又有 两个 实例。

代码有什么问题?还有其他替代方法来限制onlytask.php的一个实例正在运行吗?

PS我的/tmp/文件夹没有清理。ls -al /tmp/*.lock显示锁定文件是在第一天创建的:

-rw-r--r--  1 root root    0 Dec  4 04:03 onlyme.lock

阅读 594

收藏
2020-06-03

共1个答案

一尘不染

现在,我检查进程是否正在运行,ps并通过一个bash脚本扭曲php 脚本:

 #!/bin/bash

 PIDS=`ps aux | grep onlytask.php | grep -v grep`
 if [ -z "$PIDS" ]; then
     echo "Starting onlytask.php ..."
     php /usr/local/src/onlytask.php >> /var/log/onlytask.log &
 else
     echo "onlytask.php already running."
 fi

并每分钟运行一次bash脚本cron

2020-06-03