分享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 相关文章推荐
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
PHP中使用gettext来支持多语言的方法
May 02 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
Oct 23 PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 PHP
解析php php_openssl.dll的作用
Jul 01 PHP
php中autoload的用法总结
Nov 08 PHP
thinkphp实现数组分页示例
Apr 13 PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
PHP实现的观察者模式实例
Jun 21 PHP
浅析PHP数据导出知识点
Feb 17 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 存取 MySQL 数据库的一个例子
2006/10/09 PHP
使用PHP下载CSS文件中的图片的代码
2013/09/24 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
学习ExtJS table布局
2009/10/08 Javascript
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
python操作日期和时间的方法
2014/03/11 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
python实现字符串和字典的转换
2018/09/29 Python
python变量的存储原理详解
2019/07/10 Python
Python PyQt5整理介绍
2020/04/01 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
奖学金自我鉴定范文
2013/10/03 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
社区综治工作汇报
2014/10/27 职场文书
个人培训总结
2015/03/05 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL