多进程消费模型父进程等待并控制子进程的退出。父进程启动后,直接获取子进程的pid,然后存储到child数组中。子进程fork后直接启动业务消费代码,然后退出(0)退出,然后父进程pcntl_wait等待子进程退出。全部退出后,父进程结束代码constNEWLINE="\n\n";if(strtolower(php_sapi_name())!='cli'){die("请进入cli模式下运行");}$bizPath="./childBiz/";if(!is_dir($bizPath)){@mkdir($bizPath,0755,true);}$child=[];$index=0;$loop=10;//子进程个数//如果是资源类型的变量,则父子进程共享//$f=fopen("./pcntl_fork_2.php","r");while($index<$loop){echo"当前进程:".getmypid().NEWLINE;$pid=pcntl_fork();//forkoutofchildprocess//fork之后,父进程按照自己的逻辑,子进程从开始的地方按照自己的逻辑,栈信息会被完整的复制到子进程的内存空间,且父子进程相互独立if($pid==-1){//创建错误,return-1die('processforkfailed');}elseif($pid){//$pid>0,如果fork成功,返回子进程id//获取创建的子进程$child[$pid]=$pid;echo"{$pid}子创建!".微时间(真)。新队;}else{//$pid=0//子进程逻辑$sleepTime=rand(5,18);睡眠($sleepTime);$time=微时间(真);file_put_contents($bizPath.getmypid().".log",$时间。“:”。$index.PHP_EOL,FILE_APPEND);退出(0);}$index++;}while(count($child)){//阻塞等待$pid=pcntl_wait($status);$time=微时间(真);file_put_contents("./father.log",$time.":".$pid.":".$status.PHP_EOL,FILE_APPEND);如果($pid>0){未设置($child[$pid]);}if($pid==-1){unset($child);}//foreach($childas$k=>$pid){////非阻塞循环判断WNOHANG表示没有子进程退出则立即返回//$res=pcntl_waitpid($pid,$status,WNOHANG);//$time=microtime(true);//file_put_contents("./father.log",$time.":".$pid.":".$res.":".$status.PHP_EOL,FILE_APPEND);//if(-1==$res||$res>0){//unset($child[$k]);//}//}}//fclose($f);//主流程退出退出(0);
