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 相关文章推荐
自动把纯文本转换成Web页面的php代码
Aug 27 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
Feb 16 PHP
php画图实例
Nov 05 PHP
PHP文件锁函数flock()详细介绍
Nov 18 PHP
分享一段PHP制作的中文拼音首字母工具类
Dec 11 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
mac os快速切换多个PHP版本的方法
Mar 07 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
laravel 操作数据库常用函数的返回值方法
Oct 11 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 PHP
PHP中多字节字符串操作实例详解
Aug 23 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中的串行化变量和序列化对象
2006/09/05 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php检测文本的编码
2015/07/26 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
森林病虫害防治方案
2014/06/02 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
Python破解极验滑动验证码详细步骤
2021/05/21 Python
如何用Python搭建gRPC服务
2021/06/30 Python
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js