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

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-13 13:34:51 浏览: 评论:0 

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

php中进程的阻塞,主要是父进程等待子进程退出。

1.php代码如下:

  1. <?php 
  2.  
  3. //定义进程数量 
  4. define('FORK_NUMS', 5); 
  5.  
  6. //用于保存进程pid 
  7. $pids = array(); 
  8.  
  9. //我们创建5个子进程 
  10. for ($i = 0; $i < FORK_NUMS; ++$i) { 
  11.   $pids[$i] = pcntl_fork(); 
  12.   if ($pids[$i] == -1) { 
  13.     die('fork error'); 
  14.   } else if ($pids[$i]) { 
  15.     //这里是父进程空间,也就是主进程 
  16.     //我们的for循环第一次进入到这里时,pcntl_wait会挂起当前主进程,等待第一个子进程执行完毕退出 
  17.     //注意for循环的代码是在主进程的,挂起主进程,相当于当前的for循环也阻塞在这里了 
  18.     //第一个子进程退出后,然后再创建第二个子进程,到这里后又挂起,等待第二个子进程退出,继续创建第三个,等等。。 
  19.     pcntl_wait($status); 
  20.   } else { 
  21.     //这里是子进程空间 
  22.     echo "父进程ID: ", posix_getppid(), " 进程ID : ", posix_getpid(), " {$i} \r\n"
  23.     //我们让子进程等待3秒,再退出 
  24.     sleep(3); 
  25.     exit
  26.   } 

上面代码结果如下:

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

如果我们把pcntl_wait拿到for循环外,会是个什么结果?

2.php代码如下:

  1. <?php 
  2.  
  3. //定义进程数量 
  4. define('FORK_NUMS', 5); 
  5.  
  6. //用于保存进程pid 
  7. $pids = array(); 
  8.  
  9. //我们创建5个子进程 
  10. for ($i = 0; $i < FORK_NUMS; ++$i) { 
  11.   $pids[$i] = pcntl_fork(); 
  12.   if ($pids[$i] == -1) { 
  13.     die('fork error'); 
  14.   } else if ($pids[$i]) { 
  15.  
  16.   } else { 
  17.     //这里是子进程空间 
  18.     echo "父进程ID: ", posix_getppid(), " 进程ID : ", posix_getpid(), " {$i} \r\n"
  19.     //我们让子进程等待3秒,再退出 
  20.     sleep(3); 
  21.     exit
  22.   } 
  23.  
  24. //我们把pcntl_waitpid放到for循环外面,那样在for循环里创建子进程就不会阻塞了 
  25. //但是在这里仍会阻塞,主进程要等待5个子进程都退出后,才退出。 
  26. foreach ($pids as $pid) { 
  27.   pcntl_waitpid($pid$status); 

上面代码结果如下:

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

pcntl_wait的第二个参数可以用来设置主进程不等待子进程退出,继续执行后续代码。

3.php代码如下:

  1. <?php 
  2.  
  3. //定义进程数量 
  4. define('FORK_NUMS', 5); 
  5.  
  6. //用于保存进程pid 
  7. $pids = array(); 
  8.  
  9. //我们创建5个子进程 
  10. for ($i = 0; $i < FORK_NUMS; ++$i) { 
  11.   $pids[$i] = pcntl_fork(); 
  12.   if ($pids[$i] == -1) { 
  13.     die('fork error'); 
  14.   } else if ($pids[$i]) { 
  15.     //这里是父进程空间,也就是主进程 
  16.     //这里与1.php的代码只有一点不同,就是加了第二个参数WNOHANG 
  17.     //for循环到这里时,就不会挂起主进程,而是继续执行后续代码 
  18.     pcntl_wait($status, WNOHANG); 
  19.   } else { 
  20.     //这里是子进程空间 
  21.     echo "父进程ID: ", posix_getppid(), " 进程ID : ", posix_getpid(), " {$i} \r\n"
  22.     //我们让子进程等待3秒,再退出 
  23.     sleep(3); 
  24.     exit
  25.   } 
  26.  
  27. //在这里我们等待10秒,不然子进程还没执行完,主进程就退出了,看不出效果 
  28. sleep(10); 

上面代码结果如下:

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

代码3.php与2.php效果一样,pcntl_wait()函数的作用只是用来让父进程等待子进程退出,默认情况下会阻塞主进程。

Tags: php多进程 php父进程

分享到: