我正在使用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);
}
答案 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可以继续而无需等待它完成。