php多进程中的阻塞与非阻塞操作实例分析

本文实例讲述了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网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • 深入探究PHP的多进程编程方法

    子进程的创建 一般的子进程的写法是: <?php $pid = pcntl_fork(); if($pid == -1){ //创建失败 die('could not fork'); } else{ if($pid){ //从这里开始写的代码是父进程的 exit("parent!"); } else{ //子进程代码,为防止不停的启用子进程造成系统资源被耗尽的情况,一般子进程代码运行完成后,加入exit来确保子进程正常退出. exit("child"); }

  • 深入解析PHP中的(伪)多线程与多进程

    (伪)多线程:借助外力利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.QUOTE:我们知道PHP本身是不支持多线程的, 但是我们的WEB服务器是支持多线程的.也就是说可以同时让多人一起访问. 这也是我在PHP中实现多线程的基础.假设我们现在运行的是a.php这个文件. 但是我在程序中又请求WEB服务器运行另一个b.php那么这两个文件将是同时执行的.(PS: 一个链接请求发送之后, WEB服务器就会执行它, 而不管客户端是否已经退出)有些时候, 我们想运行的不

  • php 多进程编程父进程的阻塞与非阻塞实例分析

    本文实例讲述了php 多进程编程父进程的阻塞与非阻塞.分享给大家供大家参考,具体如下: php中进程的阻塞,主要是父进程等待子进程退出. 1.php代码如下: <?php //定义进程数量 define('FORK_NUMS', 5); //用于保存进程pid $pids = array(); //我们创建5个子进程 for ($i = 0; $i < FORK_NUMS; ++$i) { $pids[$i] = pcntl_fork(); if ($pids[$i] == -1) { die

  • php使用flock阻塞写入文件和非阻塞写入文件的实例讲解

    阻塞写入代码:(所有程序会等待上次程序执行结束才会执行,30秒会超时) <?php $file = fopen("test.txt","w+"); $t1 = microtime(TRUE); if (flock($file,LOCK_EX)) { sleep(10); fwrite($file,"Write something"); flock($file,LOCK_UN); echo "Ok locking file!&quo

  • PHP实现的CURL非阻塞调用类

    本文实例讲述了PHP实现的CURL非阻塞调用类.分享给大家供大家参考,具体如下: 前面一篇<PHP实现非阻塞模式的方法>文章讲述了PHP中实现非阻塞模式,其实如果只是HTTP的话,直接用CURL就能实现. 基于网上的一段代码,修改完善后封装了一个支持POST/GET的非阻塞调用类. 欢迎测试bug~~~~~ /***************************************************** CURL 非阻塞调用类 Auther: Linvo Copyright(C)

  • php基于session锁防止阻塞请求的方法分析

    本文实例讲述了php基于session锁防止阻塞请求的方法.分享给大家供大家参考,具体如下: 说明: 这是一篇参考国外网站http://konrness.com/php5/how-to-prevent-blocking-php-requests/ 的译文,前面一篇文章PHP编程中的Session阻塞问题与解决方法简单分析了php session阻塞的解决方法,这里给出另一种解决方法. 正文: 现代浏览器限制到一个host并发连接的数量一般为4或6.这意味着,如果您的web页面加载几十个来自同一个

  • PHP实现非阻塞模式的方法分析

    本文实例讲述了PHP实现非阻塞模式的方法.分享给大家供大家参考,具体如下: 程序非阻塞模式,这里也可以理解成并发.而并发又暂且可以分为网络请求并发 和本地并发 . 先说一下网络请求并发 理论描述 假设有一个client,程序逻辑是要请求三个不同的server,处理各自的响应.传统模型当然是顺序执行,先发送第一个请求,等待收到响应数据后再发送第二个请求,以此类推.就像是单核CPU,一次只能处理一件事,其他事情被暂时阻塞.而并发模式可以让三个server同时处理各自请求,这就可以使大量时间复用. 画

  • 简单介绍PHP非阻塞模式

    非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态. 让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑. echo "program start."; file_put_contents('log.txt','start-time:'.da

  • 关于PHP中协程和阻塞的一些理解与思考

    前言 本文主要给大家介绍了关于PHP中协程和阻塞的理解与思考,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 进程.线程.协程 关于进程.线程.协程,有非常详细和丰富的博客或者学习资源,我不在此做赘述,我大致在此介绍一下这几个东西. 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的). 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度. PHP中的协程实现

  • PHP编程中的Session阻塞问题与解决方法分析

    本文实例讲述了PHP编程中的Session阻塞问题与解决方法.分享给大家供大家参考,具体如下: 使用session过程中,在开启session后,同一浏览器,执行同一程序,不同页面会被锁.不同浏览器不会出现这种情况. 疑问:是不是session_start导致了阻塞? 于是,我写了几个页面测试了一下,发现是session导致了阻塞,而其他两种情况不会造成阻塞. 查了下PHP的Bug列表,发现有人提出了这个问题: Description: ------------ Calling session_

随机推荐