php多进程中的阻塞与非阻塞操作实例分析


Posted in PHP onMarch 04, 2020

本文实例讲述了php多进程中的阻塞与非阻塞操作。分享给大家供大家参考,具体如下:

我们通过pcntl_fork来创建子进程,使用pcntl_wait和pcntl_waitpid来回收子进程。

子进程退出后,父进程没有及时回收,就会产生僵尸进程。

例1:

<?php
define('FORK_NUMS', 5);
$pids = array();
 
//我们创建5个子进程
for($i = 0; $i < FORK_NUMS; ++$i) {
  $pids[$i] = pcntl_fork();
  if($pids[$i] == -1) {
    die('fork error');
  } else if ($pids[$i]) {
    pcntl_wait($status);
  } else {
    echo getmypid() , " {$i} \r\n";
    exit;
  }
}

我们通过for循环fork出5个子进程,父进程会阻塞着等待子进程退出,然后创建下一个子进程。

上述代码输出结果如下:

20081 0
20082 1
20083 2
20084 3
20085 4

但我们创建多进程的目的,就是为了能够并行的处理任务,阻塞的方式并不是我们想看到的。

例2:

<?php
define('FORK_NUMS', 5);
 
$pids = array();
 
//我们创建5个子进程
for($i = 0; $i < FORK_NUMS; ++$i) {
  $pids[$i] = pcntl_fork();
  if($pids[$i] == -1) {
    die('fork error');
  } else if ($pids[$i]) {
    pcntl_wait($status, WNOHANG);
  } else {
    echo getmypid() , " {$i} \r\n";
    exit;
  }
}

我们可以通过设置pcntl_wait的第二个参数为WNOHANG来控制进程是否阻塞。

该函数可以在没有子进程退出的情况下立刻跳出执行后续代码。

  • pcntl_wait等同于以pid为-1调用pcntl_waitpid函数。
  • pcntl_waitpid函数可以等待指定pid的进程。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP输出控制功能在简繁体转换中的应用
Oct 09 PHP
php 中的str_replace 函数总结
Apr 27 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 PHP
php使用smtp发送支持附件的邮件示例
Apr 13 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
laravel中的错误与日志用法详解
Jul 26 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
php 中的信号处理操作实例详解
Mar 04 #PHP
php libevent 功能与使用方法详解
Mar 04 #PHP
php+iframe 实现上传文件功能示例
Mar 04 #PHP
php实现文件上传基本验证
Mar 04 #PHP
PHP实现文件上传操作和封装
Mar 04 #PHP
PHP实现文件上传后台处理脚本
Mar 04 #PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 03 #PHP
You might like
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
重定向实现代码
2006/11/20 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
js获取 type=radio 值的方法
2014/05/09 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
2019/10/12 jQuery
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
优秀团员个人事迹材料
2014/01/29 职场文书
校园活动宣传方案
2014/03/28 职场文书
打架赔偿协议书范本
2014/10/26 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
创业计划书之餐饮
2019/09/02 职场文书