如何在php中找到PID

时间:2012-05-03 11:30:06

标签: php cron pid

我正在编写一个将通过cron运行的php脚本。它的任务是调用其他PHP脚本。被调用的脚本也可以在外部执行。我想要的是,当一个文件正在执行时,它不应该同时执行。为清楚起见,请考虑以下

假设有一个脚本master.php,它一个接一个地调用另外两个脚本script1.php和script2.php。现在,一旦它调用了script1.php,它就会开始执行并花费10分钟来完成它的处理。这个Script1.php也可以由用户在这10分钟内单独运行。

我想要做的是当这个脚本在处理过程中时,它不应该只是平行执行。

有没有办法实现这个目标? (也许通过检查script1.php的PID)。

提前完成。

5 个答案:

答案 0 :(得分:4)

这就是我用pid文件做的方法。此外,如果脚本运行超过300秒,它将被终止:

$pid_file = '/var/run/script1.pid';
if (file_exists($pid_file)) {
        $pid = file_get_contents($pid_file);
        if ($pid && file_exists('/proc/' . $pid)) {
                $time = filemtime($pid_file);
                if (time() - $time > 300) {
                        posix_kill($pid, 9);
                } else {
                    exit("Another instance of {$argv[0]} is running.\n");
                }
        }
}

$pid = posix_getpid();
if (!file_put_contents($pid_file, $pid)) exit("Can't write pid file $pid_file.\n");

然后在脚本末尾取消链接pid文件:

unlink($pid_file);

如果要在第一个实例完成时运行脚本 - 将exit()替换为sleep(1)并将整个块放入循环中。

答案 1 :(得分:3)

脚本启动时,检查是否存在锁定文件。如果没有,请创建一个。下一次启动脚本而另一个会话正在运行时,它将退出,因为锁定文件存在。在脚本的末尾,删除锁定文件。

答案 2 :(得分:0)

您可以将script1的pid存储在临时文件,管道,共享内存中,或直接存储在父脚本中。你可以使用getmypid();

从php进程获取pid

答案 3 :(得分:0)

启动脚本后,只需创建一个名为“Script1.txt”的文本文件,然后删除脚本末尾的文件。

在实际脚本运行之前(例如在Script1.php的第一行)检查该文件是否存在。如果存在,则表示您的脚本已在运行。

答案 4 :(得分:-1)

我相信exec等待执行完成。所以master.php会是这样的:

  

exec(" / path / to / php script1.php");
  exec(" / path / to / php script2.php");