分享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 和 XML: 使用expat函数(二)
Oct 09 PHP
对象失去焦点时自己动提交数据的实现代码
Nov 06 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
Yii获取当前url和域名的方法
Jun 08 PHP
PHP实现将textarea的值根据回车换行拆分至数组
Jun 10 PHP
详解WordPress中添加和执行动作的函数使用方法
Dec 29 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
Yii实现显示静态页的方法
Apr 25 PHP
php实现贪吃蛇小游戏
Jul 26 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 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
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
2014/08/28 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
python数据结构之二叉树的遍历实例
2014/04/29 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
如何用python写一个简单的词法分析器
2018/12/18 Python
Python3列表List入门知识附实例
2020/02/09 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
2014财务人员自我评价范文
2014/09/21 职场文书
付款承诺函范文
2015/01/21 职场文书
个人售房合同协议书
2016/03/21 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android