PHP 多进程实践(二)

3. 非阻塞方式
阻塞方式失去了多进程的并行性。还有一种方法,既可以回收已经结束的子进程,又可以并行。这就是非阻塞的方式。
修改脚本:
<?php
// example of multiple processes
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);
}
// ***
function garbage($signal){
       echo "signel $signal received\n" ;
      
       while (($pid = pcntl_waitpid(-1, $status, WNOHANG))> 0){
             echo "\t child end pid $pid , status $status\n" ;
      }
}
function beep(){
       echo getmypid(), "\t" , date( 'Y-m-d H:i:s', time()), "\n" ;
      sleep(1);
}
?>



用命令行运行
#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,PHP,多进程)