首页 > 开发 > PHP > 正文

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

2024-05-04 22:45:37
字体:
来源:转载
供稿:网友

本文实例讲述了PHP守护进程的两种常见实现方式。分享给大家供大家参考,具体如下:

第一种方式,借助 nohup 和 &  配合使用。

在命令后面加上 & 符号, 可以让启动的进程转到后台运行,而不占用控制台,控制台还可以再运行其他命令,这里我使用一个while死循环来做演示,代码如下

<?phpwhile(true){    echo time().PHP_EOL;    sleep(3);}

用 & 方式来启动该进程

[root@localhost php]# php deadloop.php &[1] 3454[root@localhost php]# ps aux | grep 3454root   3454 0.0 0.8 284544 8452 pts/0  T  18:06  0:00 php deadloop.phproot   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]# fgphp deadloop.php1470996682147099668514709966881470996691

以上就是关于 & 命令简单介绍

下面再来看另一个命令 nohup

在命令之前加上 nohup ,启动的进程将会忽略linux的挂起信号 (SIGHUP),那什么情况下会触发linux下SIGHUP信号呢,以下内容摘自百度百科:

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

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

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

系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。

也就是说关闭终端进程会收到SIGHUP信号,而该信号的默认处理方式就是结束掉该进程,当然 我们也可以自己处理该信号,或者忽略它,同样是上述循环的例子,我们稍加改进

<?phpdeclare(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);}

我们大可不必这么麻烦,只需要使用linux提供给我们的nohup命令,但我们使用nohup启动进程时,关闭终端,进程会忽略SIGHUP信号,也就不会退出了,首先去掉刚才的信号处理代码。然后nohup 运行。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表