我正在使用pcntl_fork()
派生一个子进程。在父代码块中,我将进程ID记录到一个文件中,这应该是子进程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);
}
发布于 2018-06-06 05:40:21
原因是shell_exec()
运行一个php
进程,然后在它自己的子进程中运行shell。因此,您具有以下流程层次结构:
- php -- original script
- shell -- created by pcntl_fork() and shell_exec
- php -- created by executing "php" in shell
pcntl_fork()
返回的PID是第二个进程。
您可以使用exec
命令告诉shell使用自己的进程来运行php
命令:
$command = "exec php " . dirname(__FILE__) . "/my_script.php";
但是,如果要执行此操作,则不能在命令末尾使用&
。为了在后台运行命令,必须在新进程中运行该命令,这样原始shell就可以继续运行,而无需等待它完成。
https://stackoverflow.com/questions/50708392
复制相似问题