学习完毕,打卡
$processNum = 4;
$timeStart = time();
$tasks = range(1, 20);
$jobs = [];
foreach ($tasks as $task) {
//这里讲返回的结果对4进行取模,存入4个数组,然后4个进程分别读取不同的数据进行处理
$jobs[$task % $processNum][] = $task;
}
$mainPid = posix_getpid();
echo "主进程:" . $mainPid . PHP_EOL;
for ($i = 0; $i < $processNum; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} elseif ($pid) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
} else { // 子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
$content = $jobs[$i];
$childStart = time();
foreach ($content as $v2) {
sleep(1); // 子进程执行的逻辑
}
$childEnd = time();
$childDiff = $childEnd - $childStart;
echo "#" . posix_getpid() . "执行完毕,用时:" . $childDiff . "秒" . PHP_EOL;
exit(); // 子进程执行完后必须退出,否则会循环的创建进程...
}
}
//这里挂起主进程,等待子进程全部退出后再退出主进程
while ($processNum > 0) {
if ( pcntl_wait($status) > 0) {
$processNum--;
echo "#" . $pid . "退出" . PHP_EOL;
}
}
$timeEnd = time();
$diff = $timeEnd - $timeStart;
echo '共计用时:' . $diff . '秒';