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下判断数组中是否存在相同的值array_unique
Mar 25 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
php重定向的三种方法分享
Feb 22 PHP
php class中public,private,protected的区别以及实例分析
Jun 18 PHP
解析PHP中ob_start()函数的用法
Jun 24 PHP
php创建sprite
Feb 11 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
ThinkPHP实现一键清除缓存方法
Jun 26 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
Jan 04 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中养成7个面向对象的好习惯
2010/01/28 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
WebStorm ES6 语法支持设置&amp;babel使用及自动编译(详解)
2017/09/08 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Python实现简单状态框架的方法
2015/03/19 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
对python中的logger模块全面讲解
2018/04/28 Python
Python常见内置高效率函数用法示例
2018/07/31 Python
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
如何安装ruby on rails
2014/02/09 面试题
办理护照介绍信
2014/01/16 职场文书
银行员工职业规划范文
2014/01/21 职场文书
小班下学期评语
2014/05/04 职场文书
公司担保书格式范文
2014/05/12 职场文书
旷工检讨书1000字
2015/01/01 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书
python实现监听键盘
2021/04/26 Python
nginx静态资源的服务器配置方法
2022/07/07 Servers