分享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简洁函数(PHP简单明了函数语法)
Jun 10 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
Jan 09 PHP
2014年10个最佳的PHP图像操作库
Jul 14 PHP
浅析get与post的一些特殊情况
Jul 28 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
php正则preg_replace_callback函数用法实例
Jun 01 PHP
CodeIgniter中使用Smarty3基本配置
Jun 29 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
Dec 31 PHP
PHP常用的三种设计模式
Feb 17 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 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
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
2017/11/06 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
python如何实现excel数据添加到mongodb
2015/07/30 Python
python实现一组典型数据格式转换
2018/12/15 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
python实现代码统计器
2019/09/19 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
啤酒节策划方案
2014/05/28 职场文书
初中教师个人工作总结
2015/02/10 职场文书
委托书范本格式
2019/04/18 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL
mysql自增长id用完了该怎么办
2022/02/12 MySQL
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL