php 多进程fork

PHP技术
544
0
0
2023-02-01
<?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--;
}
echo "done.\n\n";