分享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 相关文章推荐
新版mysql+apache+php Linux安装指南
Oct 09 PHP
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
PHP7多线程搭建教程
Apr 21 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
Oct 31 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
js读取注册表的键值示例
2013/09/25 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
十个Python程序员易犯的错误
2015/12/15 Python
Python正则表达式教程之二:捕获篇
2017/03/02 Python
Flask框架信号用法实例分析
2018/07/24 Python
python实现图片上添加图片
2019/11/26 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
什么是接口(Interface)?
2013/02/01 面试题
应届大学生自荐信格式
2013/09/21 职场文书
工商技校毕业生自荐信
2013/11/15 职场文书
专营店会计助理岗位职责
2013/11/29 职场文书
小学六年级学生评语
2014/04/22 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
求职教师自荐书
2014/06/19 职场文书
应聘护士求职信
2014/07/21 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python