php pcntl 进程池_分享PHP-pcntl 实现多进程代码

PHP使用PCNTL系列的函数也能做到多进程处理一个事务。比如我需要从数据库中获取80w条的数据,再做一系列后续的处理,这个时候,用单进程?你可以等到明年今天了。。。所以应该使用pcntl函数了。

下面我们来看个实例

代码

$arChildId = array();

for($i = 0; $i < 10; $i++)

{

$iPid = pcntl_fork();

if($iPid == -1)

{

die('can\'t be forked.');

}

if($iPid)

{

# 主进程逻辑

$arChildId[] = $iPid;

}

else

{

# 子进程逻辑

$iPid = posix_getpid(); # 获取子进程的ID

$iSeconds = rand(5, 30);

echo '* Process '. $iPid. ' was created, and Executed, and Sleep '. $iSeconds. PHP_EOL;

excuteProcess($iPid, $iSeconds);

exit();

}

}

while(count($arChildId) > 0)

{

foreach($arChildId as $iKey=> $iPid)

{

$res = pcntl_waitpid($iPid, $status, WNOHANG);

if($res == -1 || $res > 0)

{

unset($arChildId[$iKey]);

echo '* Sub process: '. $iPid. ' exited with '. $status. PHP_EOL;

}

}

}

# 子进程执行的逻辑

function excuteProcess($iPid, $iSeconds)

{

file_put_contents('./log/'.$iPid.'.log', $iPid.PHP_EOL, FILE_APPEND);

sleep($iSeconds);

}

?>

运行结果

* Process 16163 was created, and Executed, and Sleep 11

* Process 16164 was created, and Executed, and Sleep 21

* Process 16165 was created, and Executed, and Sleep 24

* Process 16166 was created, and Executed, and Sleep 27

* Process 16167 was created, and Executed, and Sleep 8

* Process 16168 was created, and Executed, and Sleep 14

* Process 16169 was created, and Executed, and Sleep 14

* Process 16170 was created, and Executed, and Sleep 26

* Process 16171 was created, and Executed, and Sleep 20

* Process 16172 was created, and Executed, and Sleep 21

* Sub process: 16167 exited with 0

* Sub process: 16163 exited with 0

* Sub process: 16169 exited with 0

* Sub process: 16168 exited with 0

* Sub process: 16171 exited with 0

* Sub process: 16164 exited with 0

* Sub process: 16172 exited with 0

* Sub process: 16165 exited with 0

* Sub process: 16170 exited with 0

* Sub process: 16166 exited with 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值