分享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横向重复区域显示二法
Sep 25 PHP
一些使用频率比较高的php函数
Oct 03 PHP
file_get_contents获取不到网页内容的解决方法
Mar 07 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 PHP
destoon实现资讯信息前面调用它所属分类的方法
Jul 15 PHP
php之static静态属性与静态方法实例分析
Jul 30 PHP
PHP常用的小程序代码段
Nov 14 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
May 16 PHP
php 的反射详解及示例代码
Aug 25 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP实现随机发扑克牌
Apr 22 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新手上路(八)
2006/10/09 PHP
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
vue axios用法教程详解
2017/07/23 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
Python中装饰器高级用法详解
2017/12/25 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
雷锋精神演讲稿
2014/05/13 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
解约证明模板
2015/06/19 职场文书
红歌会主持词
2015/07/02 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
Python合并多张图片成PDF
2021/06/09 Python