本文实例讲述了PHP守护进程的两种常见实现方式。分享给大家供大家参考,具体如下:
第一种方式,借助 nohup 和 & 配合使用。
在命令后面加上 & 符号, 可以让启动的进程转到后台运行,而不占用控制台,控制台还可以再运行其他命令,这里我使用一个while死循环来做演示,代码如下
用 & 方式来启动该进程
可以看到该进程并未占用控制台,控制台还可以运行其他命令,这时我们还可以通过 fg 命令让进程恢复到普通占用控制台的模式。
以上就是关于 & 命令简单介绍
下面再来看另一个命令 nohup
在命令之前加上 nohup ,启动的进程将会忽略linux的挂起信号 (SIGHUP),那什么情况下会触发linux下SIGHUP信号呢,以下内容摘自百度百科:
SIGHUP会在以下3种情况下被发送给相应的进程:
1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程) 2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程 3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
结合 1和2 我们知道,不管是否以 & (job方式)启动的进程,关闭终端时都会收到 SIGHUP 信号 ,那么进程收到 SIGHUP 信号会如何处理呢,看同样是摘自百度百科的一句话
系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
也就是说关闭终端进程会收到SIGHUP信号,而该信号的默认处理方式就是结束掉该进程,当然 我们也可以自己处理该信号,或者忽略它,同样是上述循环的例子,我们稍加改进
我们大可不必这么麻烦,只需要使用linux提供给我们的nohup命令,但我们使用nohup启动进程时,关闭终端,进程会忽略SIGHUP信号,也就不会退出了,首先去掉刚才的信号处理代码。然后nohup 运行。
nohup: 忽略输入并把输出追加到"nohup.out"
并且nohup默认会把程序的输出重定向到当前目录下的nohup.out文件,如果没有可写权限,则写入 $homepath/nohup.out
此时 关闭终端,进程不会结束,而是变成了孤儿进程(ppid=1),因为创建它的父进程退出了。
结论:
所以当我们组合 nohup 和 & 两种方式时,启动的进程不会占用控制台,也不依赖控制台,控制台关闭之后进程被1号进程收养,成为孤儿进程,这就和守护进程的机制非常类似了。其中 >logs.txt 重定向标准输出,2>error.txt 重定向标准错误输出。
以上就是关于第一种实现方式的介绍。
第二种实现方式就是根据守护进程的规则和特点通过代码来实现,守护进程最大的特点就是脱离了用户终端和会话,下面是实现的代码,关键地方进行了注释。
That's all!
更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《PHP常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。