分享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