php 多进程fork

<?php

const TASK_NUM = 10;   // 任务数
const MAX_PROCESS = 3; // 最大进程数量,并发控制

$running = 0; // 记录正在运行的子进程数
for ($i = 0; $i < TASK_NUM; $i++) {
    $pid = pcntl_fork(); // 开启新进程

    if ($pid == -1) {
        die("could not fork"); // 开启失败
    } elseif ($pid) {
        // 父进程逻辑
        // echo "父进程逻辑 \n";
        $running++; // 进程数+1
        if ($running >= MAX_PROCESS) { // 子进程开启数量达到上限
            pcntl_wait($status); // 等待有子进程退出
            $running--; // 有子进程退出,进程数-1
        }
        // echo "父进程逻辑end \n";
    } else {
        // 子进程逻辑
        echo "子进程逻辑 \n";
        $ss = rand(1, 20);
        echo "child:$i, sleep $ss second... \n";
        sleep($ss);
        echo "child:$i, finish sleep.\n";
        exit(0); // 子进程逻辑结束,注意退出点
    }
}

// 等待所有子进程都结束
//while ($running) {
//   pcntl_wait($status);
//  $running--;
//}

// 等待所有子进程都结束(改进)
while  (  1  )  {  
    echo(  '等待....'  ); 
    $pid  =  pcntl_wait(  $status  );  
    printf(  "主进程: 当前子进程 id = %d 退出\n",  $pid  );  
    if  (  $pid  <  0  )  { 
        break; 
    } 
}
echo "done.\n\n";
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

你跑了这个任务没?

        if ($running >= MAX_PROCESS) { // 子进程开启数量达到上限
            pcntl_wait($status,WNOHANG); // 等待有子进程退出
            $running--; // 有子进程退出,进程数-1
        }

你这里的pcntl_wait 设置了第二参数非阻塞 那么你的进程限制数是没用的。也就是说会同时跑10个子进程。而不是最多跑3个子进程

还有下面的 等待所有子进程退出建议改为

while ( 1 ) {
    echo( '等待....' );
    $pid = pcntl_wait( $status );
    printf( "主进程: 当前子进程 id = %d 退出\n", $pid );
    if ( $pid < 0 ) {
        break;
    }
}

否则你的这个代码直接跑。进程退出了 子进程还在打印内容

1年前 评论
my38778570 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!