php教程之多进程实例(2)

发布时间:2019-10-25编辑:脚本学堂
本文介绍下,在php编程中,实现php多进程的实例代码,本文是第二节的内容,有需要的朋友参考下。

本节内容:
php教程之php多进程实例的第二部分。

3,非阻塞方式
阻塞方式失去了多进程的并行性。
还有一种方法,既可以回收已经结束的子进程,又可以并行。
这就是非阻塞的方式。
修改脚本
 

复制代码 代码示例:
<?php 
// 多进程实例
date_default_timezone_set( 'Asia/Chongqing'); 
declare (ticks = 1); 
pcntl_signal(SIGCHLD, "garbage" ); 
echo "parent start, pid ", getmypid(), "n" ; 
beep(); 
for ($i=0; $i<3; ++$i){ 
      $pid = pcntl_fork(); 
       if ($pid == -1){ 
             die ("cannot fork" ); 
      } else if ($pid > 0){ 
             echo "parent continue n"; 
             for ($k=0; $k<2; ++$k){ 
                  beep(); 
            } 
      } else if ($pid == 0){ 
             echo "child start, pid ", getmypid(), "n" ; 
             for ($j=0; $j<5; ++$j){ 
                  beep(); 
            } 
             exit (0); 
      } 

// parent 
while (1){ 
       // do something else 
      sleep(5); 

// www.jb200.com
function garbage($signal){ 
       echo "signel $signal receivedn" ; 
       
       while (($pid = pcntl_waitpid(-1, $status, WNOHANG))> 0){ 
             echo "t child end pid $pid , status $statusn" ; 
      } 

function beep(){ 
       echo getmypid(), "t" , date( 'Y-m-d H:i:s', time()), "n" ; 
      sleep(1); 

?> 

命令行运行PHP代码:
#php -f test.php &

输出结果:
 

parent start, pid 2066
2066    2013-01-14 16:45:34
parent continue
2066    2013-01-14 16:45:35
child start, pid 2067
2067    2013-01-14 16:45:35
20662067  2013-01-14 16:45:362013-01-14 16:45:36

2067    2013-01-14 16:45:37
parent continue
2066    2013-01-14 16:45:37
child start, pid 2068
2068    2013-01-14 16:45:37
2067    2013-01-14 16:45:38
2068    2013-01-14 16:45:38
2066    2013-01-14 16:45:38
parent continue
2066    2013-01-14 16:45:40
child start, pid 2069
2069    2067    2013-01-14 16:45:40
2013-01-14 16:45:40
2068    2013-01-14 16:45:40
2066    2013-01-14 16:45:41
2069    2013-01-14 16:45:41
2068    2013-01-14 16:45:41
signel 17 received
         child end pid 2067, status 0
2069    2013-01-14 16:45:42
2068    2013-01-14 16:45:42
2069    2013-01-14 16:45:43
signel 17 received
         child end pid 2068, status 0
2069    2013-01-14 16:45:44
signel 17 received
         child end pid 2069, status 0

代码说明:
多个进程又并行运行了,而且运行大约10秒钟之后,用 ps -ef | grep php 查看正在运行的进程,只有一个进程
lqling    2066  1388  0 16:45 pts/1    00:00:00 php -f t5.php
是父进程,子进程被回收了。

4,子进程退出状态
pcntl_waitpid(-1, $status, WNOHANG) $status
返回子进程的结束状态

>>> php多进程实例-目录索引:
php教程之多进程实例(1)
php教程之多进程实例(3)

>>> 延伸阅读:
php多进程并行执行脚本的代码
有关php多进程的用法举例
php中启用多进程的实例详解(ubuntu系统)
php实现多进程 多任务的一例代码
php 多进程编程的深入探讨
php 多进程实现守护进程的实例代码
php 多进程编程的实例代码
php 多进程解决代码常驻内存的问题
PHP 多进程的实现代码一例
PHP多进程并发控制的测试实例
php多进程操作的三个实例