应用场景:某些情况下,我们需要持续的周期性的提供一些服务,比如监控内存或cpu的运行状况,这些应用与客户端是没有关系的,不是说客户端(如web界面,手机app等)关闭了,我们就不监控内存或cpu了,为了应对这种业务场景,后台守护进程就可以派上用场了。
步骤:
1.创建一个daemon.php文件,内容如下:
<?php class Daemon { /** * 初始化一个守护进程 * @throws Exception */ public function init(){ // 创建一个字进程 $pid = pcntl_fork(); if ($pid == -1) { throw new Exception('fork子进程失败'); } else if ($pid > 0) { // 父进程退出, 子进程变成孤儿进程被1号进程收养, 进程脱离终端 exit(0); } // 创建一个新的会话, 脱离终端控制, 更改子进程为组长进程 $sid = posix_setsid(); if ($sid == -1) { throw new Exception('setsid fail'); } // 修改当前进程的工作目录, 由于子进程会继承父进程的工作目录, 修改工作目录以释放对父进程工作目录的占用 chdir('/'); /** * 通过上一步,我们创建了一个新的会话组长,进程组长,且脱离了终端,但是会话组长可以申请重新打开一个终端,为了避免 * 这种情况,我们再次创建一个子进程,并退出当前进程,这样运行的进程就不再是会话组长。 */ $pid = pcntl_fork(); if ($pid == -1) { throw new Exception('fork子进程失败'); } else if ($pid > 0){ //再一次退出父进程,子进程成为最终的守护进程 exit(0); } //由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符 fclose(STDIN); fclose(STDOUT); fclose(STDERR); } } $daemon = new Daemon; $daemon->init; // 业务代码 while (true) { echo 'success'; file_put_contents('/usr/local/src/log.txt', date('Y-m-d H:i:s').PHP_EOL, FILE_APPEND); sleep(2); }
2.以后台方式运行php脚本:
nohup php /usr/local/src/daemon.php &
3.查看日志输出:
tail -f /usr/local/src/log.txt
4.关闭php后台进程:
首先,我们需要查出该进程的PID:
ps -ef | grep "php /usr/local/src/daemon.php"
然后,通过这个PID把该进程kill掉:
kill -9 22767 // 其中,22767就是php后台进程的PID号
5.开机自启
在实际的应用中,我们不可能每次都是手动开启,这样我们就会损失掉一部分业务数据,所以我们必须要让该进程开机自动运行,在/etc/rc.local文件中,加入以下即可
nohup php /usr/local/src/daemon.php &
原文地址:https://blog.csdn.net/echojson/article/details/79926880