php僵尸,PHP 多进程之孤儿和僵尸简单讲解

PHP多进程之孤儿/僵尸

what

init进程

普通用户运行但有超级权限的进程

孤儿进程

父进程在子进程处理完前退出, 子进程就会变成孤儿进程;并由init进程进行处理

僵尸进程

「z+」标记

父进程fork子进程后, 没有调用wait来维护子进程,导致子进程无人管理

why

总是不断fork, 不管维护。系统资源有限 -- 就会出现僵尸进程

how

相比孤儿进程,僵尸进程危害更大,毕竟孤儿还有init妈妈来抚养,僵尸就只能独自游荡!

pcntl_wait

pcntl_waitpid

等待或返回fork的子进程状态

相同

pcntl_wait($status, $option) == pcntl_waitpid(-1, $status, $option)

pcntl_waitpid($pid, $status, $option)

pid

-1: 等待任意子进程;与pcntl_wait函数行为一致

0: 等待任意与调用进程组ID相同的子进程

0: 等待进程号等于参数pid值的子进程

option

WNOHANG: 如果没有子进程退出立刻返回

WUNTRACED: 子进程已经退出并且其状态未报告时返回

孤儿进程

$pid = pcntl_fork();

switch($pid) {

case 0:

// 子进程

echo "I am son parent's pid=".posix_getppid()."\n";

for( $i = 1; $i <= 10; $i++ ){

sleep( 1 );

// posix_getppid()函数的作用就是获取当前进程的父进程进程ID

echo "parent's pid =" posix_getppid().PHP_EOL;

}

break;

case -1:

// fork error

echo "I am err\n";

break;

default:

// 父进程

echo "I am parent pid=".posix_getpid()."\n";

sleep(2);

break;

}

// 第三秒后 由init进程收养

僵尸进程

$pid = pcntl_fork();

switch($pid) {

case 0:

// 子进程

cli_set_process_title("son process php");

sleep(5);

break;

case -1:

// fork error

break;

default:

// 父进程

cli_set_process_title("parent process php");

sleep(30);

break;

}

// 子进程执行后父进程未取管理导致

解决

switch($pid) {

case 0:

// 子进程

cli_set_process_title("son process php");

sleep(10);

break;

case -1:

// fork error

break;

default:

// 父进程

cli_set_process_title("parent process php");

$iid = pcntl_wait($status); // 等待子进程的状态处理

// 监控子进程状态处理后才能输出

// 只要未触发pcntl_wait,此后的逻辑一直不会处理

echo $iid."-----\n";

//sleep(60);

break;

}

===

// 增加pcntl_wait

// pcntl_wait($status); // 只要子进程不退出, 父进程就会阻塞再这个地方

更优解决

$pid = pcntl_fork();

switch($pid) {

case 0:

// 子进程

cli_set_process_title("son process php");

sleep(10);

break;

case -1:

// fork error

break;

default:

// 父进程

cli_set_process_title("parent process php");

pcntl_waitpid($pid, $status, WNOHANG); // 监控$pid, 如果没有子进程退出立刻返回

echo "I am parent\n";

//sleep(60);

break;

}

===

// pcntl_wait改写pcntl_waitpid

// pcntl_waitpid($pid, $status, WNOHANG);

// 如果再pcntl_waitpid后续增加sleep, 还是会僵尸进程

更更优解决

信号

本作品采用《CC 协议》,转载必须注明作者和本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值