分享PHP-pcntl 实现多进程代码
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。比如我需要从数据库中获取80w条的数据,再做一系列后续的处理,这个时候,用单进程?你可以等到明年今天了。。。所以应该使用pcntl函数了。
下面我们来看个实例
代码
<?php $arChildId=array(); for($i=0;$i<10;$i++) { $iPid=pcntl_fork(); if($iPid==-1) { die('can\'tbeforked.'); } if($iPid) { #主进程逻辑 $arChildId[]=$iPid; } else { #子进程逻辑 $iPid=posix_getpid();#获取子进程的ID $iSeconds=rand(5,30); echo'*Process'.$iPid.'wascreated,andExecuted,andSleep'.$iSeconds.PHP_EOL; excuteProcess($iPid,$iSeconds); exit(); } } while(count($arChildId)>0) { foreach($arChildIdas$iKey=>$iPid) { $res=pcntl_waitpid($iPid,$status,WNOHANG); if($res==-1||$res>0) { unset($arChildId[$iKey]); echo'*Subprocess:'.$iPid.'exitedwith'.$status.PHP_EOL; } } } #子进程执行的逻辑 functionexcuteProcess($iPid,$iSeconds) { file_put_contents('./log/'.$iPid.'.log',$iPid.PHP_EOL,FILE_APPEND); sleep($iSeconds); } ?>
运行结果
*Process16163wascreated,andExecuted,andSleep11 *Process16164wascreated,andExecuted,andSleep21 *Process16165wascreated,andExecuted,andSleep24 *Process16166wascreated,andExecuted,andSleep27 *Process16167wascreated,andExecuted,andSleep8 *Process16168wascreated,andExecuted,andSleep14 *Process16169wascreated,andExecuted,andSleep14 *Process16170wascreated,andExecuted,andSleep26 *Process16171wascreated,andExecuted,andSleep20 *Process16172wascreated,andExecuted,andSleep21 *Subprocess:16167exitedwith0 *Subprocess:16163exitedwith0 *Subprocess:16169exitedwith0 *Subprocess:16168exitedwith0 *Subprocess:16171exitedwith0 *Subprocess:16164exitedwith0 *Subprocess:16172exitedwith0 *Subprocess:16165exitedwith0 *Subprocess:16170exitedwith0 *Subprocess:16166exitedwith0