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编写PDF文档生成器
Oct 09 PHP
How do I change MySQL timezone?
Mar 26 PHP
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
php记录日志的实现代码
Aug 08 PHP
PHP文件操作实现代码分享
Sep 01 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
PHP开发Apache服务器配置
Jul 15 PHP
php 的反射详解及示例代码
Aug 25 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
php测试kafka项目示例
Feb 06 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 图片上添加透明度渐变的效果
2009/06/29 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
vue实现计算器功能
2020/02/22 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
Python生成词云的实现代码
2020/01/14 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
小学生自我鉴定
2013/10/12 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
换届选举主持词
2015/07/03 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python