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 协议》,转载必须注明作者和本文链接
你跑了这个任务没?
你这里的pcntl_wait 设置了第二参数非阻塞 那么你的进程限制数是没用的。也就是说会同时跑10个子进程。而不是最多跑3个子进程
还有下面的 等待所有子进程退出建议改为
否则你的这个代码直接跑。进程退出了 子进程还在打印内容