cli模式下,可以多进程加速执行 (php-fpm下不适用,其多进程有自身的机制)
// 这些变量也会fork到每个进程 $pv = []; for ($i = 0; $i < 10; $i++) { $pv[] = $i * 10 + $i; } // print_r($pv); for ($i = 0; $i < 10; $i++) { $pid = pcntl_fork(); // 上面这个语句会fork出一个子进程 // 所有变量都被fork,例如子进程的$i,和主进程的$i已经完全是不同进程中的两个变量了 // 此部分代码,在主进程、子进程都会执行 // echo "公共区域$i "; // 下面这是主进程和子进程分别单独的代码 if ($pid == 0) { echo "子进程 {$i} : {$pv[$i]} = "; echo $pid . "-children-" . time() . "-" . $i++ . PHP_EOL; // 如果退出,子进程自己终止了(不一定回收,见下面),循环也结束了 // 如果不退出会继续复制 进程 return; } else if($pid>0) { // echo $pid . "-parent-" . time() . "-" . $i . PHP_EOL; // 主进程执行完会退出 // 子进程不会退出,会形成 孤儿进程 或者 僵尸进程 // 孤儿进程 父进程已退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。
// 孤儿进程会被系统的init进程(pid=1)收养,init进程会成为这些子进程的新父进程。 // 孤儿进程一般没有什么危害,因为孤儿进程退出后,init进程会回收它的相关资源。 // 僵尸进程 子进程退出后,如果父进程还在运行,但父进程没有调用wait()或waitpid(),那么该子进程将无法被父进程回收,从而成为僵尸进程。
// 僵尸进程只能等到其父进程退出后由系统的init进程回收。 // 僵尸进程在其父进程不退出的情况下,会一直占用进程ID以及相关资源,无法释放,应尽量避免, // 解决办法:父进程循环调用pcntl_wait函数等到所有的子进程退出,从而避免孤儿进程和僵尸进程产生。 while (($pid = pcntl_wait($status)) > 0) { // echo "\n子进程[$pid]已退出, status = $status\n"; } } else{ echo "进程fork出错。\n"; } } // 因为子进程已经退出,以下的代码也仅主进程执行 echo "主进程已结束\n";
标签:fork,孤儿,pid,echo,退出,进程,php From: https://www.cnblogs.com/mitang/p/16647482.html