分享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 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
PHP开发入门教程之面向对象
Dec 05 PHP
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
php 获取select下拉列表框的值
May 08 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
Jun 13 PHP
PHP中mysql_field_type()函数用法
Nov 24 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
PHP简单读取PDF页数的实现方法
Jul 21 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
Yii2框架控制器、路由、Url生成操作示例
May 27 PHP
七种PHP开发环境搭建工具
Jun 28 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开发中常用的8个小技巧
2008/08/27 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
Javascript模块模式分析
2008/05/16 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
Python3基础之list列表实例解析
2014/08/13 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
Python中常见的数制转换有哪些
2020/05/27 Python
python判断变量是否为列表的方法
2020/09/17 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
工厂实习感言
2014/01/14 职场文书
元旦联欢会感言
2014/03/04 职场文书
小学评语大全
2014/04/22 职场文书
国庆节演讲稿
2014/05/27 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
2014年司机工作总结
2014/11/21 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
python实现过滤敏感词
2021/05/08 Python
Pygame Draw绘图函数的具体使用
2021/11/17 Python