分享PHP-pcntl 实现多进程代码

 更新时间:2016年09月30日 08:49:39   作者:zhaoyingnan911  
PHP可通过PCNTL扩展实现进程控制,如进程创建,信号处理,进程中断判断等。但只能在CLI模式下操作。PCNTL的信号机制是基于 ticks 机制实现的。

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中的全局变量

    下面小编就为大家带来一篇全面了解PHP中的全局变量。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • PHP实现多条件查询实例代码

    PHP实现多条件查询实例代码

    在我们的网站设计过程中,经常会用到多条件查询,本文的源码是一个二手房屋查询的例子。在本例中,我们要实现能够通过地理位置,物业类型,房屋价格,房屋面积及信息发布日期等多个条件查询到客户所需的资料。
    2010-07-07
  • 实例讲解PHP页面静态化

    实例讲解PHP页面静态化

    本篇文章主要给大家通过实例讲解了PHP页面静态化的原理以及相关方法,对此有需要的朋友参考下吧。
    2018-02-02
  • php生成随机颜色方法汇总

    php生成随机颜色方法汇总

    前段时间在一个项目中,需要在同一个页面中的任意div背景颜色值,用php自动生成,也就是说每个div都产生不同的颜色
    2014-12-12
  • yii2.0框架多模型操作示例【添加/修改/删除】

    yii2.0框架多模型操作示例【添加/修改/删除】

    这篇文章主要介绍了yii2.0框架多模型操作,结合实例形式分析了Yii2.0多模型添加、修改及删除具体实现技巧,需要的朋友可以参考下
    2020-04-04
  • Laravel6.18.19如何优雅的切换发件账户

    Laravel6.18.19如何优雅的切换发件账户

    这篇文章主要给大家介绍了关于Laravel6.18.19如何优雅的切换发件账户的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Laravel6.18.19具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • 浅谈Laravel模板实体转义带来的坑

    浅谈Laravel模板实体转义带来的坑

    今天小编就为大家分享一篇浅谈Laravel模板实体转义带来的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • php实现二叉树中和为某一值的路径方法

    php实现二叉树中和为某一值的路径方法

    在本篇文章中我们给大家分享了php实现二叉树中和为某一值的路径方法,有需要的朋友们可以参考下。
    2018-10-10
  • php递归函数三种实现方法及如何实现数字累加

    php递归函数三种实现方法及如何实现数字累加

    实现递归函数有哪些方法呢?如何用递归函数实现数字累加?这篇文章就主要介绍php递归函数三种实现方法及如何实现数字累加,需要的朋友可以参考下。
    2015-08-08
  • 使用php测试硬盘写入速度示例

    使用php测试硬盘写入速度示例

    使用php写入一个1GB大小的文件,检查硬盘的写速率,可能有一定误差,一般电脑读写在20M/s,这个测试要执行大概40-50s
    2014-01-01

最新评论