当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-18 10:40:43 浏览: 评论:0 

本文实例讲述了php多进程中的阻塞与非阻塞操作,分享给大家供大家参考,具体如下:

我们通过pcntl_fork来创建子进程,使用pcntl_wait和pcntl_waitpid来回收子进程。

子进程退出后,父进程没有及时回收,就会产生僵尸进程。

例1:

  1. <?php 
  2. define('FORK_NUMS', 5); 
  3. $pids = array(); 
  4.    
  5. //我们创建5个子进程 
  6. for($i = 0; $i < FORK_NUMS; ++$i) { 
  7.   $pids[$i] = pcntl_fork(); 
  8.   if($pids[$i] == -1) { 
  9.     die('fork error'); 
  10.   } else if ($pids[$i]) { 
  11.     pcntl_wait($status); 
  12.   } else { 
  13.     echo getmypid() , " {$i} \r\n"
  14.     exit
  15.   } 
  16. <?php 
  17. define('FORK_NUMS', 5); 
  18. $pids = array(); 
  19.  
  20. //我们创建5个子进程 
  21. for($i = 0; $i < FORK_NUMS; ++$i) { 
  22.   $pids[$i] = pcntl_fork(); 
  23.   if($pids[$i] == -1) { 
  24.     die('fork error'); 
  25.   } else if ($pids[$i]) { 
  26.     pcntl_wait($status); 
  27.   } else { 
  28.     echo getmypid() , " {$i} \r\n"
  29.     exit
  30.   } 

我们通过for循环fork出5个子进程,父进程会阻塞着等待子进程退出,然后创建下一个子进程。

上述代码输出结果如下:

20081 0

20082 1

20083 2

20084 3

20085 4

但我们创建多进程的目的,就是为了能够并行的处理任务,阻塞的方式并不是我们想看到的。

例2:

  1. <?php 
  2. define('FORK_NUMS', 5); 
  3.    
  4. $pids = array(); 
  5.    
  6. //我们创建5个子进程 
  7. for($i = 0; $i < FORK_NUMS; ++$i) { 
  8.   $pids[$i] = pcntl_fork(); 
  9.   if($pids[$i] == -1) { 
  10.     die('fork error'); 
  11.   } else if ($pids[$i]) { 
  12.     pcntl_wait($status, WNOHANG); 
  13.   } else { 
  14.     echo getmypid() , " {$i} \r\n"
  15.     exit
  16.   } 
我们可以通过设置pcntl_wait的第二个参数为WNOHANG来控制进程是否阻塞。

该函数可以在没有子进程退出的情况下立刻跳出执行后续代码。

pcntl_wait等同于以pid为-1调用pcntl_waitpid函数。

pcntl_waitpid函数可以等待指定pid的进程。

Tags: php多进程 php阻塞 php非阻塞

分享到: