为什么pcntl_fork返回的进程ID与实际运行的进程ID不同?

时间:2018-06-05 20:23:52

标签: php

我正在使用pcntl_fork()来生成子进程。在父代码块中,我将进程ID记录到一个文件中,这应该是子进程ID,对吗?

此进程ID与实际运行时不同。

$pid = pcntl_fork();

if ($pid == -1) {
    die('could not fork');
} else if ($pid) {
    // we are the parent
    file_put_contents(dirname(__FILE__) . "/update.pid", $pid);
    //pcntl_wait($status); //Protect against Zombie children
} else {
    $command = "php " . dirname(__FILE__) . "/my_script.php &";
    $output = shell_exec($command);
}

1 个答案:

答案 0 :(得分:0)

原因是shell_exec()运行shell进程,然后它在自己的子进程中运行php。因此,您具有以下流程层次结构:

- php -- original script
    - shell -- created by pcntl_fork() and shell_exec
        - php -- created by executing "php" in shell

pcntl_fork()返回的PID是第二个过程。

您可以使用php命令告诉shell使用自己的进程来运行exec命令:

$command = "exec php " . dirname(__FILE__) . "/my_script.php";

但是,如果要执行此操作,则不能在命令末尾使用&。为了在后台运行命令,它必须在新进程中运行,因此原始shell可以继续而无需等待它完成。