首页 > 技术文章 > 基于Linux环境,创建PHP后台守护进程(转载)

howey 2019-01-09 16:30 原文

应用场景:某些情况下,我们需要持续的周期性的提供一些服务,比如监控内存或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

推荐阅读