3

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

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

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

有没有办法做到这一点?(也许通过检查 script1.php 的 PID)。

提前谢谢。

4

5 回答 5

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) 并将整个块放入循环中。

于 2012-05-03T11:40:56.933 回答
3

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

于 2012-05-03T11:33:09.923 回答
0

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

于 2012-05-03T11:33:19.013 回答
0

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

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

于 2012-05-03T11:34:56.300 回答
-1

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

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

于 2012-05-03T11:37:11.600 回答