分享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一些公用函数的集合
Mar 27 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 PHP
理解PHP中的stdClass类
Apr 18 PHP
php模拟服务器实现autoindex效果的方法
Mar 10 PHP
php中get_defined_constants函数用法实例分析
May 12 PHP
php常用表单验证类用法实例
Jun 18 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
自制PHP框架之路由与控制器
May 07 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 03 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
Apr 01 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教程 插件机制在PHP中实现方案
2012/11/02 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
JavaScript基础——使用Canvas绘图
2016/11/02 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
python 串行执行和并行执行实例
2020/04/30 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
Python 图片处理库exifread详解
2021/02/25 Python
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
求职者简历中的自我评价
2013/10/20 职场文书
辅导员评语
2014/05/04 职场文书
心得体会的写法
2014/09/05 职场文书
校运会通讯稿
2015/07/18 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
Golang中channel的原理解读(推荐)
2021/10/16 Golang