PHP守护进程的两种常见实现方式详解,PHP守护进

2019-10-01 12:48栏目:网络技术
TAG:

PHP守护进程实现也是前几天数不胜数人会赶过的操作设计,大许多人可能还不亮堂怎么落到实处PHP守护进度,上面小说就给咱们大快朵颐下实际的落到实处形式和代码,感兴趣的一同来看看。

本文实例陈说了PHP守护进度的二种常见完毕方式。分享给大家供我们参谋,具体如下:

第一种艺术,借助 nohup 和 & 合作使用。
在命令后边加上 & 符号, 能够让运行的进度转到后台运转,而不占用调控台,调节台还足以再运营其余命令,这里小编利用二个while死循环来做示范,代码如下

率先种办法,借助 nohup 和 &  合作使用。

首先种方法,借助 nohup 和 &  合作使用。

<?php  

while(true){  
        echo time().PHP_EOL;  
        sleep(3);  
}  

在命令后边加上 & 符号, 能够让运营的长河转到后台运营,而不占用调节台,调整台还足以再运转别的命令,这里小编使用一个while死循环来做示范,代码如下

在指令前边加上 & 符号, 能够让运转的进度转到后台运转,而不占用调节台,调整台还足以再运营别的命令,这里本人动用一个while死循环来做示范,代码如下

用 & 情势来运营该进度

<?php
while(true){
    echo time().PHP_EOL;
    sleep(3);
}
<?php
while(true){
    echo time().PHP_EOL;
    sleep(3);
}
[root@localhost php]# php deadloop.php &  
[1] 3454  
[root@localhost php]# ps aux | grep 3454  
root      3454  0.0  0.8 284544  8452 pts/0    T    18:06   0:00 php deadloop.php  
root      3456  0.0  0.0 103316   896 pts/0    S+   18:08   0:00 grep 3454  

[1]+  Stopped                 php deadloop.php  
[root@localhost php]#   

用 & 格局来运转该进度

用 & 格局来运行该进程

能够见见该进度未有占用调整台,调节台还是能运转别的命令,那时大家还足以因而fg 命令让进度苏醒到平凡占用调控台的形式。

[root@localhost php]# php deadloop.php &
[1] 3454
[root@localhost php]# ps aux | grep 3454
root   3454 0.0 0.8 284544 8452 pts/0  T  18:06  0:00 php deadloop.php
root   3456 0.0 0.0 103316  896 pts/0  S+  18:08  0:00 grep 3454
[1]+ Stopped         php deadloop.php
[root@localhost php]#
[root@localhost php]# php deadloop.php &
[1] 3454
[root@localhost php]# ps aux | grep 3454
root   3454 0.0 0.8 284544 8452 pts/0  T  18:06  0:00 php deadloop.php
root   3456 0.0 0.0 103316  896 pts/0  S+  18:08  0:00 grep 3454
[1]+ Stopped         php deadloop.php
[root@localhost php]#
[root@localhost php]# fg  
php deadloop.php  
1470996682  
1470996685  
1470996688  
1470996691  

可以见见该进度未有占用调整台,调节台还是能够运营别的命令,这时大家还足以由此fg 命令让进度苏醒到普通占用调控台的方式。

能够观察该进程未有占用调整台,调控台还足以运作别的命令,那时我们仍是可以透过 fg 命令让进度恢复到日常占用调节台的情势。

如上就是关于 & 命令简介
上面再来看另一个指令 nohup
在命令在此以前拉长 nohup ,运行的进度将会忽略linux的挂起功率信号(SIGHUP),那如何情形下会触发linux下SIGHUP实信号呢,以下内容摘自百度宏观:

[root@localhost php]# fg
php deadloop.php
1470996682
1470996685
1470996688
1470996691
[root@localhost php]# fg
php deadloop.php
1470996682
1470996685
1470996688
1470996691
SIGHUP会在以下3种情况下被发送给相应的进程:  
1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)  
2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程  
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。  

结合 1和2 我们知道,不管是否以 & (job方式)启动的进程,关闭终端时都会收到  SIGHUP 信号 ,那么进程收到 SIGHUP 信号会如何处理呢,看同样是摘自百度百科的一句话

如上正是关于 & 命令简介

如上便是有关 & 命令简介

系统对SIGHUP时域信号的默许管理是终止收到该时域信号的长河。所以若程序中向来不捕捉该频域信号,当接过该确定性信号时,进程就能够脱离。

下边再来看另一个限令 nohup

下边再来看另三个命令 nohup

也正是说关闭终端进程会抽出SIGHUP确定性信号,而该复信号的暗许管理形式正是终止掉该进度,当然 我们也得以自个儿管理该非时域信号,恐怕忽视它,同样是上述循环的事例,大家稍加立异

在指令从前拉长 nohup ,运营的历程将会忽略linux的挂起随机信号(SIGHUP),那如何动静下会触发linux下SIGHUP信号呢,以下内容摘自百度周到:

在指令以前增进 nohup ,运转的长河将会忽略linux的挂起随机信号(SIGHUP),那怎么情况下会触发linux下SIGHUP确定性信号呢,以下内容摘自百度健全:

<?php  

declare(ticks = 1);  
pcntl_signal(SIGHUP, function(){  
        //  这地方处理信号的方式我们只是简单的写入一句日志到文件中  
        file_put_contents('logs.txt', 'pid : ' . posix_getpid() . ' receive SIGHUP 信号' . PHP_EOL);  
});  

while(true){  
        echo time().PHP_EOL;  
        sleep(3);  
}  

SIGHUP会在以下3种情况下被发送给相应的进程:

SIGHUP会在偏下3种状态下被发送给相应的历程:

大家不必要这么麻烦,只必要运用linux提必要我们的nohup命令,但大家运用nohup运维进程时,关闭终端,进程会忽略SIGHUP实信号,也就不会脱离了,首先排除刚才的实信号管理代码。然后nohup 运营。

1、终端关闭时,该频限信号被发送到session首进程以及作为job提交的历程(即用 & 符号提交的历程) 2、session首进度退出时,该数字信号被发送到该session中的前台进度组中的每一个进度
3、若父过程退出形成进程组成为孤儿进程组,且该进度组中有经过处于终止状态(收到SIGSTOP或SIGTSTP时域信号),该功率信号会被发送到该进程组中的每三个历程。

1、终端关闭时,该时域信号被发送到session首进度以及作为job提交的历程(即用 & 符号提交的历程)
2、session首进度退出时,该确定性信号被发送到该session中的前台进度组中的每三个进度
3、若父进度退出导致进度组成为孤儿进度组,且该进度组中有经过处于终止状态(收到SIGSTOP或SIGTSTP能量信号),该实信号会被发送到该进度组中的每贰个历程。

[root@localhost php]# nohup php deadloop.php   
nohup: 忽略输入并把输出追加到"nohup.out"  

重组 1和2 大家领会,不管是或不是以 & (job格局)运维的进度,关闭终端时都会收到  SIGHUP 复信号 ,那么进程收到 SIGHUP 实信号会如什么地点理吧,看未有差距是摘自百度宏观的一句话

组合 1和2 大家通晓,不管是还是不是以 & (job形式)运转的长河,关闭终端时都会收下  SIGHUP 数字信号 ,那么进程收到 SIGHUP 频限信号会如哪里理吧,看一样是摘自百度完善的一句话

并且nohup暗中同意会把程序的输出重定向到当前目录下的nohup.out文件,如果未有可写权限,则写入 $homepath/nohup.out

系统对SIGHUP频限信号的默许管理是终止收到该时域信号的经过。所以若程序中从不捕捉该非数字信号,当接过该数字信号时,进度就能够脱离。

系统对SIGHUP实信号的暗中同意管理是结束收到该复信号的历程。所以若程序中从不捕捉该非时域信号,当收到该时域信号时,进程就能够脱离。

[root@localhost php]# ls  
cmd.sh  deadloop.php  getPhoto.php  nohup.out  pics  
[root@localhost php]# tail -f nohup.out   
1470999772  
1470999775  
1470999778  
1470999781  
1470999784  
1470999787  
1470999790  
1470999793  
1470999796  
1470999799  
1470999802  

也正是说关闭终端进度会收下SIGHUP功率信号,而该功率信号的暗许管理格局就是截至掉该进程,当然 大家也足以和睦解和管理理该时域信号,可能忽视它,同样是上述循环的例子,大家稍加创新

也正是说关闭终端进程会接到SIGHUP实信号,而该能量信号的暗中同意管理方式正是终结掉该进度,当然 我们也得以和谐管理该信号,大概忽视它,同样是上述循环的事例,大家稍加创新

此刻 关闭终端,进度不会完毕,而是改为了孤儿进度(ppid=1),因为创立它的父进度退出了。

<?php
declare(ticks = 1);
pcntl_signal(SIGHUP, function(){
    // 这地方处理信号的方式我们只是简单的写入一句日志到文件中
    file_put_contents('logs.txt', 'pid : ' . posix_getpid() . ' receive SIGHUP 信号' . PHP_EOL);
});
while(true){
    echo time().PHP_EOL;
    sleep(3);
}
<?php
declare(ticks = 1);
pcntl_signal(SIGHUP, function(){
    // 这地方处理信号的方式我们只是简单的写入一句日志到文件中
    file_put_contents('logs.txt', 'pid : ' . posix_getpid() . ' receive SIGHUP 信号' . PHP_EOL);
});
while(true){
    echo time().PHP_EOL;
    sleep(3);
}
[root@localhost ~]# ps -ef | grep 3554  
root      3554  3497  0 19:09 pts/0    00:00:00 php deadloop.php  
root      3575  3557  0 19:10 pts/1    00:00:00 grep 3554  
[root@localhost ~]# ps -ef | grep 3554  
root      3554     1  0 19:09 ?        00:00:00 php deadloop.php  
root      3577  3557  0 19:10 pts/1    00:00:00 grep 3554  
[root@localhost ~]#   

咱俩没有必要这么麻烦,只供给动用linux提必要大家的nohup命令,但我们采用nohup运营进程时,关闭终端,进程会忽视SIGHUP时限信号,也就不会退出了,首先排除刚才的时限信号管理代码。然后nohup 运转。

大家大可不必这么劳碌,只需求利用linux提供给我们的nohup命令,但大家利用nohup运转进度时,关闭终端,进度会忽略SIGHUP功率信号,也就不会脱离了,首先排除刚才的实信号管理代码。然后nohup 运营。

结论: 所以当我们结合 nohup 和 & 两种形式时,运转的进程不会占领调节台,也不依赖调控台,调节台关闭之后经过被1号经过收养,成为孤儿进程,那就和医生和护师进度的机制特别周围了。

[root@localhost php]# nohup php deadloop.php
[root@localhost php]# nohup php deadloop.php
[root@localhost php]# nohup php deadloop.php >logs.txt 2>error.txt &  
[1] 3612  
[root@localhost php]# ps -ef |grep 3612  
root      3612  3557  0 19:18 pts/1    00:00:00 php deadloop.php  
root      3617  3557  0 19:19 pts/1    00:00:00 grep 3612  
[root@localhost php]#   

nohup: 忽略输入并把出口追加到"nohup.out"

nohup: 忽略输入并把出口追加到"nohup.out"

里头 >logs.txt 重定向规范输出,2>error.txt 重定向标准错误输出。
以上就是有关率先种达成格局的介绍。
第三种完结形式正是基于守护进度的法则和特点通过代码来落实,守护进程最大的特征就是退出了客商终端和对话,上面是促成的代码,关键地点举办了疏解。

与此同一时间nohup暗中认可会把程序的输出重定向到当前目录下的nohup.out文件,若无可写权限,则写入 $homepath/nohup.out

况且nohup默许会把程序的出口重定向到当前目录下的nohup.out文件,若无可写权限,则写入 $homepath/nohup.out

<?php  

$pid = pcntl_fork();  

if ($pid == -1)  
{  
    throw new Exception('fork子进程失败');  
}  
elseif ($pid > 0)  
{  
    //父进程退出,子进程变成孤儿进程被1号进程收养,进程脱离终端  
    exit(0);  
}  

// 最重要的一步,让该进程脱离之前的会话,终端,进程组的控制  
posix_setsid();  

// 修改当前进程的工作目录,由于子进程会继承父进程的工作目录,修改工作目录以释放对父进程工作目录的占用。  
chdir('/');  

/* 
 * 通过上一步,我们创建了一个新的会话组长,进程组长,且脱离了终端,但是会话组长可以申请重新打开一个终端,为了避免 
 * 这种情况,我们再次创建一个子进程,并退出当前进程,这样运行的进程就不再是会话组长。 
 */  
$pid = pcntl_fork();  
if ($pid == -1)  
{  
    throw new Exception('fork子进程失败');  
}  
elseif ($pid > 0)  
{  
    //  再一次退出父进程,子进程成为最终的守护进程  
    exit(0);  
}  

// 由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符  
fclose(STDIN);  
fclose(STDOUT);  
fclose(STDERR);  

/* 
 * 处理业务代码 
 */  

while(TRUE)  
{  
    file_put_contents('log.txt', time().PHP_EOL, FILE_APPEND);  
    sleep(5);  
}  
[root@localhost php]# ls
cmd.sh deadloop.php getPhoto.php nohup.out pics
[root@localhost php]# tail -f nohup.out
1470999772
1470999775
1470999778
1470999781
1470999784
1470999787
1470999790
1470999793
1470999796
1470999799
1470999802
[root@localhost php]# ls
cmd.sh deadloop.php getPhoto.php nohup.out pics
[root@localhost php]# tail -f nohup.out
1470999772
1470999775
1470999778
1470999781
1470999784
1470999787
1470999790
1470999793
1470999796
1470999799
1470999802

近日做事中开掘能够动用 supervisor 四个python进度管理工科具很便利

转载自:http://blog.csdn.net/zhang197093/article/details/52226349

那会儿 关闭终端,进度不会实现,而是成为了孤儿进度(ppid=1),因为制造它的父进度退出了。

那儿 关闭终端,进度不会终结,而是改为了孤儿进度(ppid=1),因为创设它的父进度退出了。

[root@localhost ~]# ps -ef | grep 3554
root   3554 3497 0 19:09 pts/0  00:00:00 php deadloop.php
root   3575 3557 0 19:10 pts/1  00:00:00 grep 3554
[root@localhost ~]# ps -ef | grep 3554
root   3554   1 0 19:09 ?    00:00:00 php deadloop.php
root   3577 3557 0 19:10 pts/1  00:00:00 grep 3554
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep 3554
root   3554 3497 0 19:09 pts/0  00:00:00 php deadloop.php
root   3575 3557 0 19:10 pts/1  00:00:00 grep 3554
[root@localhost ~]# ps -ef | grep 3554
root   3554   1 0 19:09 ?    00:00:00 php deadloop.php
root   3577 3557 0 19:10 pts/1  00:00:00 grep 3554
[root@localhost ~]#

敲定:所以当大家构成 nohup 和 & 三种艺术时,运营的进度不会攻陷调整台,也不借助于调节台,控制台关闭之后经过被1号经过收养,成为孤儿进程,这就和医生和医护人员进度的体制特别周围了。

结论: 所以当大家构成 nohup 和 & 二种艺术时,运转的经过不会占领调整台,也不重视控制台,调节台关闭之后经过被1号经过收养,成为孤儿进度,那就和医生和医护人员进度的编写制定非常周边了。

[root@localhost php]# nohup php deadloop.php >logs.txt 2>error.txt &
[1] 3612
[root@localhost php]# ps -ef |grep 3612
root   3612 3557 0 19:18 pts/1  00:00:00 php deadloop.php
root   3617 3557 0 19:19 pts/1  00:00:00 grep 3612
[root@localhost php]#
[root@localhost php]# nohup php deadloop.php >logs.txt 2>error.txt &
[1] 3612
[root@localhost php]# ps -ef |grep 3612
root   3612 3557 0 19:18 pts/1  00:00:00 php deadloop.php
root   3617 3557 0 19:19 pts/1  00:00:00 grep 3612
[root@localhost php]#

当中 >logs.txt 重定向规范输出,2>error.txt 重定向规范错误输出。

其中 >logs.txt 重定向标准输出,2>error.txt 重定向规范错误输出。

如上正是关于率先种完毕格局的牵线。

以上正是关于率先种完成方式的牵线。

第二种完结方式就是基于守护进程的条条框框和特征通过代码来促成,守护进度最大的特色正是退出了客商终端和对话,上边是兑现的代码,关键位置开展了批注。

第三种完成形式正是依赖守护进度的平整和特色通过代码来贯彻,守护进程最大的性状正是退出了客商终端和对话,上面是兑现的代码,关键地点开展了批注。

<?php
$pid = pcntl_fork();
if ($pid == -1)
{
  throw new Exception('fork子进程失败');
}
elseif ($pid > 0)
{
  //父进程退出,子进程变成孤儿进程被1号进程收养,进程脱离终端
  exit(0);
}
// 最重要的一步,让该进程脱离之前的会话,终端,进程组的控制
posix_setsid();
// 修改当前进程的工作目录,由于子进程会继承父进程的工作目录,修改工作目录以释放对父进程工作目录的占用。
chdir('/');
/*
 * 通过上一步,我们创建了一个新的会话组长,进程组长,且脱离了终端,但是会话组长可以申请重新打开一个终端,为了避免
 * 这种情况,我们再次创建一个子进程,并退出当前进程,这样运行的进程就不再是会话组长。
 */
$pid = pcntl_fork();
if ($pid == -1)
{
  throw new Exception('fork子进程失败');
}
elseif ($pid > 0)
{
  // 再一次退出父进程,子进程成为最终的守护进程
  exit(0);
}
// 由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
/*
 * 处理业务代码
 */
while(TRUE)
{
  file_put_contents('log.txt', time().PHP_EOL, FILE_APPEND);
  sleep(5);
}
<?php
$pid = pcntl_fork();
if ($pid == -1)
{
  throw new Exception('fork子进程失败');
}
elseif ($pid > 0)
{
  //父进程退出,子进程变成孤儿进程被1号进程收养,进程脱离终端
  exit(0);
}
// 最重要的一步,让该进程脱离之前的会话,终端,进程组的控制
posix_setsid();
// 修改当前进程的工作目录,由于子进程会继承父进程的工作目录,修改工作目录以释放对父进程工作目录的占用。
chdir('/');
/*
 * 通过上一步,我们创建了一个新的会话组长,进程组长,且脱离了终端,但是会话组长可以申请重新打开一个终端,为了避免
 * 这种情况,我们再次创建一个子进程,并退出当前进程,这样运行的进程就不再是会话组长。
 */
$pid = pcntl_fork();
if ($pid == -1)
{
  throw new Exception('fork子进程失败');
}
elseif ($pid > 0)
{
  // 再一次退出父进程,子进程成为最终的守护进程
  exit(0);
}
// 由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
/*
 * 处理业务代码
 */
while(TRUE)
{
  file_put_contents('log.txt', time().PHP_EOL, FILE_APPEND);
  sleep(5);
}

That's all!

That's all!

越来越多关于PHP相关内容感兴趣的读者可查看本站专项论题:《PHP进度与线程操作技能总括》、《PHP网络编制程序才具总计》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法计算》、《php+mysql数据库操作入门教程》及《php常见数据库操作本事汇总》

指望本文所述对大家PHP程序设计有所帮衬。

您恐怕感兴趣的篇章:

  • 分享PHP守护进度类
  • 何以写php守护进程(Daemon)
  • PHP守护进度实例
  • php守护进度加linux命令nohup完毕职分每秒实践三次
  • PHP守护进度化在C和PHP情况下的兑现

版权声明:本文由澳门新葡亰平台游戏发布于网络技术,转载请注明出处:PHP守护进程的两种常见实现方式详解,PHP守护进