pcntl_fork() 用于开启子进程,windows系统无法使用;可以应用的场景如单机模拟并发的环境等等;如接口压力测试(秒杀功能),数据库写死锁测试,curl方式爬站提高效率,甚至ddos和cc;子进程开启的并发数量视机器性能,以下代码在虚拟机中测试,开启1000个子进程时,时间为分段并且在打印输出时出现卡顿;
$pid = pcntl_fork(); // 相当于同时开启了一个主进程和一个子进程;返回值-1时表示开启进程失败,0表示子进程开启成功,>0表示主进程开启成功;在实际应用中主进程什么都不用做,仅仅需要在并发的子进程中实现业务逻辑
直接上代码,实现开启并发子进程
<?php
$i=0;
while($i!=10){
$pid = pcntl_fork();
//echo $pid."-parent-".time()."-".$i++.PHP_EOL;
$i++;
//sleep(1);
if ($pid == 0) {
//echo "子进程".PHP_EOL;
echo $pid."-children-".time()."-".$i++.PHP_EOL;
sleep(10);
echo 1;
return;
}
}
?>
以上代码输出为,由子进程输出的
0-children-1553879286-2
0-children-1553879286-3
0-children-1553879286-4
0-children-1553879286-1
0-children-1553879286-9
0-children-1553879286-10
0-children-1553879286-6
0-children-1553879286-7
0-children-1553879286-8
0-children-1553879286-5
等待10秒后,可以在控制台中看见打印了10个1
已经确定在主进程结束后子进程仍然在运行,PHP实现异步的队列处理耗时任务可以基于pcntl_fork()函数实现;
子进程中的sleep(10)对主进程没有任何影响