分享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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
PHP中将网页导出为Word文档的代码
May 25 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
PHP实现通过URL提取根域名
Mar 31 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 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实现的替换敏感字符串类实例
2014/09/22 PHP
php查看当前Session的ID实例
2015/03/16 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
Prototype 学习 Prototype对象
2009/07/12 Javascript
Javascript var变量隐式声明方法
2009/10/19 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
python实现最长公共子序列
2018/05/22 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
超简单的Python HTTP服务
2019/07/22 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
护理专业推荐信
2013/11/07 职场文书
社会实践自我鉴定
2013/11/07 职场文书
校长岗位职责
2013/11/26 职场文书
集团公司总经理岗位职责
2013/12/20 职场文书
拔河比赛口号
2014/06/10 职场文书
运动会演讲稿100字
2014/08/25 职场文书
开发房地产协议书
2014/09/14 职场文书
员工试用期工作总结
2019/06/20 职场文书