php教程之多进程实例(2)
本节内容:
php教程之php多进程实例的第二部分。
3,非阻塞方式
阻塞方式失去了多进程的并行性。
还有一种方法,既可以回收已经结束的子进程,又可以并行。
这就是非阻塞的方式。
修改脚本:
// 多进程实例
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.jbxue.com
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代码:
#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多进程操作的三个实例
您可能感兴趣的文章:
php教程之多进程实例(3)
php入门教程(索引)
php教程之多进程实例(2)
适合入门的php基础系列教程
php为什么要使用swoole
php多进程操作的三个实例
PHP正则取图片路径的例子
PHP如何实现字符串16进制转换2进制?
php入门基础教程之php循环语句
PHP多进程、信号量及孤儿进程和僵尸进程