php进程守护进程,用php编写守护进程

在此之前,需要知道守护进程这个概念,知道之后,才可以用php来编写守护进程。那么创建守护进程需要有下面这几个步骤。

1.创建子进程,父进程退出

父进程先与子进程退出,子进程则会被1号进程收养,这个子进程就会成为init的子进程

php使用pcntl_fork()来创建子进程。

pcntl_fork()返回一个整型值,在父进程里面返回的是子进程的id,子进程返回的是0,失败则返回-1。这样我们就可以根据这个来分别控制父进程和子进程执行任务。

2.子进程创建会话

这个是重要的一步,在这一步中该子进程会做这些事情:1.让进程摆脱原会话的控制;2.让进程摆脱员进程组的控制;3.让进程摆脱终端的控制。

为什么要这样?这个在守护进程介绍里面有

php这里使用posix_setsid()来在这个子进程中创建会话,使得这个进程成为会话组组长

通过这两步骤就可以创建一个守护进程了。如果多需要多进程,那么只需要在这个守护进程fork子进程就可以。

那么有这两个步骤,就可以开始写代码了。

function children(){

posix_setsid();

sleep(100);

}

$pid = pcntl_fork();

//fork失败pid为-1

if( $pid == -1 ){

exit('fork error');

}

//pid为0为子进程执行的部分

if( $pid == 0 ){

children();

}else{

//这里是父进程执行的部分,直接退出

exit('parent exit');

}

?>

上面的代码什么也没干,只是创建了一个什么也不干的守护进程,想干点什么,那么可以在children里面去写吧,既然是守护进程,那么我们一般用来再次fork子进程来干活。

/**

* 需要进行的作业

*/

function worker(){

$pid = pcntl_fork();

if( $pid == -1 ){

exit('fork error');

}

if( $pid == 0 ){

for( $i=0;$i<50;$i++ ){

file_put_contents("log","hello {$i}\n",FILE_APPEND);

sleep(1);

}

}

}

/**

* 子进程

*/

function children(){

$sid = posix_setsid();

echo $sid;

for( $i=0;$i<2;$i++ ){

worker();

}

sleep(100);

}

$pid = pcntl_fork();

if( $pid == -1 ){

exit('fork error');

}

if( $pid == 0 ){

children();

}else{

exit('parent exit');

}

?>

上面的代码就是子进程再次fork两个子进程来执行任务。是没隔1s向log里面写入一行文字。

上面的代码中,在children进程我们称之为master进程,下面有两个worker进程。函数里面使用了sleep(100)是为了不让master进程马上就退出,如果该进程退出了,那么这个进程下面的子进程则又会成为孤儿进程。

实际过程中,肯定不能使用sleep()函数不让master进程退出的,需要使用pcntl_wait($status,WUNTRACED);来等待子进程的信号。

赞赏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值