分享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实现WEB动态网页静态
Oct 09 PHP
php 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
Mar 11 PHP
php记录代码执行时间(实现代码)
Jul 05 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
PHP实现根据银行卡号判断银行
Apr 29 PHP
php图像处理类实例
Jul 28 PHP
PHP抽奖算法程序代码分享
Oct 08 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
php简单实现MVC
2015/02/05 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
vuex进阶知识点巩固
2018/05/20 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
Python 多核并行计算的示例代码
2017/11/07 Python
python读取中文txt文本的方法
2018/04/12 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
python pip如何手动安装二进制包
2020/09/30 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
服装销售人员求职自我评价
2013/09/26 职场文书
营销与策划专业毕业生求职信
2013/11/01 职场文书
感恩节活动方案
2014/01/27 职场文书
高三自我评价
2014/02/01 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
建筑横幅标语
2014/10/09 职场文书
Docker部署Mysql8的实现步骤
2022/07/07 Servers