我正在编写一个将通过cron运行的php脚本。它的任务是调用其他PHP脚本。被调用的脚本也可以在外部执行。我想要的是,当一个文件正在执行时,它不应该同时执行。为清楚起见,请考虑以下
假设有一个脚本master.php,它一个接一个地调用另外两个脚本script1.php和script2.php。现在,一旦它调用了script1.php,它就会开始执行并花费10分钟来完成它的处理。这个Script1.php也可以由用户在这10分钟内单独运行。
我想要做的是当这个脚本在处理过程中时,它不应该只是平行执行。
有没有办法实现这个目标? (也许通过检查script1.php的PID)。
提前完成。
答案 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");