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笔记之:有规律大文件的读取与写入的分析
Apr 26 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
PHP获取远程图片并保存到本地的方法
May 12 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
PHP闭包定义与使用简单示例
Apr 13 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 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 xml实例 留言本
2009/03/20 PHP
PHP 输出缓存详解
2009/06/20 PHP
Django 中 cookie的使用
2017/08/17 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
javascript document.referrer 用法
2009/04/30 Javascript
js function定义函数使用心得
2010/04/15 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
JScript实现地址选择功能
2017/08/15 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
分享6个隐藏的python功能
2017/12/07 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
python调用staf自动化框架的方法
2018/12/26 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
授权委托书范文
2014/07/31 职场文书
春季运动会加油词
2015/07/18 职场文书
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server