分享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在字符串中查找另一个字符串
Nov 19 PHP
PHP HTML代码串截取代码
Dec 29 PHP
php邮件发送,php发送邮件的类
Mar 24 PHP
php数组声明、遍历、数组全局变量使用小结
Jun 05 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
Sep 26 PHP
php中autoload的用法总结
Nov 08 PHP
php递归方法实现无限分类实例代码
Feb 28 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
PHP实现自动识别Restful API的返回内容类型
Feb 07 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 PHP
PHP fopen函数用法实例讲解
Feb 15 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
一个多文件上传的例子(原创)
2006/10/09 PHP
一个域名查询的程序
2006/10/09 PHP
PHP的FTP学习(二)
2006/10/09 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
详解Vue爬坑之vuex初识
2017/06/14 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
Python实现图像几何变换
2015/07/06 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
Flask数据库迁移简单介绍
2017/10/24 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python将pandas datarame保存为txt文件的实例
2019/02/12 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
保洁主管岗位职责
2013/11/20 职场文书
门诊挂号室室长岗位职责
2013/11/27 职场文书
工作交流会欢迎词
2014/01/12 职场文书
支教自我鉴定
2014/01/18 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
三八妇女节活动总结
2014/05/04 职场文书
舞蹈专业求职信
2014/06/13 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
校长师德表现自我评价
2015/03/04 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python