php 多进程

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;

                // 特别注意,子进程是全新进程,里面的链接的外部服务会失效,例如mysql,分词等,需要重新链接

          // 子进程需要退出(不一定回收,参见下面),循环也终止了
          // 注意,return 是返回,其他情况可能需要使用exit退出 // 如果不退出会继续复制 进程
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";

 

posted @ 2022-09-01 18:34  忘忧般若汤  阅读(233)  评论(0编辑  收藏  举报