分享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安全配置方法
Jun 16 PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
php防盗链的常用方法小结
Jul 02 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
javascript some()函数用法详解
Nov 13 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
php实现网站留言板功能
Nov 04 PHP
php+mysql实现无限级分类
Nov 11 PHP
PHP简单实现文本计数器的方法
Apr 28 PHP
CI框架支持$_GET的两种实现方法
May 18 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
实例分析PHP将字符串转换成数字的方法
Jan 27 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php获取后台Job管理的实现代码
2011/06/10 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
2015/03/19 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
详解php中反射的应用
2016/03/15 PHP
js 立即调用的函数表达式如何写
2014/01/12 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
Django框架中方法的访问和查找
2015/07/15 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
python 实现多维数组(array)排序
2020/02/28 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
应届毕业生如何写求职信
2014/02/16 职场文书
怎样写辞职信
2015/02/27 职场文书
阿凡达观后感
2015/06/10 职场文书
导游词之凤凰古城
2019/10/22 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
一文带你探究MySQL中的NULL
2021/11/11 MySQL