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项目打包方法
Feb 18 PHP
jQuery 源码分析笔记
May 25 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
Mar 04 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
Feb 15 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 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 输出URL的快捷方式示例代码
2013/09/22 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
javascript removeChild 使用注意事项
2009/04/11 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python解析xml中dom元素的方法
2015/03/12 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
商务经理岗位职责
2014/07/30 职场文书
学籍证明模板
2015/06/18 职场文书
给领导敬酒词
2015/08/12 职场文书
go goroutine 怎样进行错误处理
2021/07/16 Golang
PO模式在selenium自动化测试框架的优势
2022/03/20 Python