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 相关文章推荐
BBS(php &amp; mysql)完整版(一)
Oct 09 PHP
繁体中文转换为简体中文的PHP函数
Oct 09 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
php读取目录所有文件信息dir示例
Mar 18 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
使用ThinkPHP生成缩略图及显示
Apr 27 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
PHP验证类的封装与使用方法详解
Jan 10 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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
zend framework配置操作数据库实例分析
2012/12/06 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
JavaScript版代码高亮
2006/06/26 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
Node.js模块加载详解
2014/08/16 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
vue项目创建步骤及路由router
2020/01/14 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
高级技校毕业生自荐信
2013/11/18 职场文书
前台文员个人求职信范文
2014/01/05 职场文书
八一建军节感言
2014/02/28 职场文书
毕业自我鉴定怎么写
2014/03/25 职场文书
党员岗位承诺书
2014/03/25 职场文书
班级年度安全计划书
2014/05/01 职场文书
代办社保委托书范文
2014/10/06 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
党内外群众意见范文
2015/06/02 职场文书