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


Posted in PHP onSeptember 30, 2016

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

下面我们来看个实例

代码

<?php
$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
PHP 相关文章推荐
PHP读取MySQL数据代码
Jun 05 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
PHP中常见的缓存技术实例分析
Sep 23 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
Oct 10 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
Jun 24 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 PHP
php插件Xajax使用方法详解
Aug 31 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP convert_uudecode()函数讲解
Feb 14 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
php时间戳转换代码详解
Aug 04 PHP
PHP编写daemon process详解及实例代码
Sep 30 #PHP
PHP 极验验证码实例讲解
Sep 29 #PHP
php自定义函数转换html标签示例
Sep 29 #PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 #PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 #PHP
分享一个漂亮的php验证码类
Sep 29 #PHP
你不知道的文件上传漏洞php代码分析
Sep 29 #PHP
You might like
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
jquery插件之easing使用
2010/08/19 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
js date 格式化
2017/02/15 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
python使用urllib2提交http post请求的方法
2015/05/26 Python
深入解析Python中函数的参数与作用域
2016/03/20 Python
python之PyMongo使用总结
2017/05/26 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
中专生毕业自我鉴定
2013/11/01 职场文书
2014年医院工作总结
2014/11/20 职场文书
会计求职简历自我评价
2015/03/10 职场文书
民间借贷被告代理词
2015/05/23 职场文书
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis
MySQL数据库简介与基本操作
2022/05/30 MySQL