【问题标题】:how to find PID in php如何在php中找到PID
【发布时间】:2012-05-12 21:56:04
【问题描述】:

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

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

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

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

提前谢谢。

【问题讨论】:

    标签: php cron pid


    【解决方案1】:

    这就是我使用 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) 并将整个块置于循环中。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果你不指定解释器,这不会启动 php 脚本。此外,这不会阻止某人在 cron 作业旁边启动脚本。
      • 你是对的。 php 的路径应以 exec 为前缀(除非脚本以 #!/path/to/php 开头)。是的,仍然可以在 cron 作业旁边启动脚本。尽管如此,迄今为止最简单的解决方案..
      【解决方案3】:

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

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

      【讨论】:

      • 当脚本由于错误/超时/其他原因而过早退出时你会怎么做?你最终会得到一个锁定文件,并且脚本将永远不会再次启动。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2019-07-04
          • 2019-01-03
          • 1970-01-01
          • 2014-12-17
          • 2012-09-09
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多