分享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 缓冲的免费实现方法
Oct 09 PHP
php error_log 函数的使用
Apr 13 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
PHP中对于浮点型的数据需要用不同的方法解决
Mar 11 PHP
php绘制一条弧线的方法
Jan 24 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
Feb 16 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
php实现微信支付之现金红包
May 30 PHP
PHP递归算法的简单实例
Feb 28 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
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
Listloading.js移动端上拉下拉刷新组件
2016/08/04 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
js中less常用的方法小结
2017/08/09 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
2018/01/18 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
python随机取list中的元素方法
2018/04/08 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
Linux Interview Questions For software testers
2012/06/02 面试题
J2EE模式面试题
2016/10/11 面试题
培训讲师邀请函
2014/01/10 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
师德师风自查总结
2014/10/14 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers