php 编写linux守护进程

本文介绍如何将PHP程序转化为Linux守护进程在后台运行的方法。通过创建子进程、更改工作目录、关闭标准输入输出等步骤实现程序的守护进程化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:将一个php程序以linux守护进程(在后台运行)的方式运行?


解决方法:(见代码)

// index.php文件

<?php

/*实现守护进程化,当你的PHP程序需要转为后台运行时,
只需要调用一次封装好的函数init()即可。
编写守护进程的一般步骤步骤:
(1)在父进程中执行fork并exit推出;
(2)在子进程中调用setsid函数创建新的会话;
(3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;
(4)在子进程中执行fork并exit推出;
(5)在子进程中调用umask函数,设置进程的umask为0;
(6)在子进程中关闭任何不需要的文件描述符
*/
class Daemon{
    public function init(){
        //创建一个子进程
        $pid = pcntl_fork();

        if ($pid == -1){
            throw new Exception('fork子进程失败');
        }elseif ($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子进程失败');
        } elseif ($pid > 0) {
            //再一次退出父进程,子进程的子进程(孙子进程)成为最终的守护进程
            exit(0);
        }

        umask(0); //重设文件创建掩模

//由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符
        fclose(STDIN);
        fclose(STDOUT);
        fclose(STDERR);
    }
}
/*
 * 当前操作系统为linux时,启动linux守护进程*/
if (strtoupper(substr(PHP_OS, 0, 3)) === 'Linux') {
    $daemon = new Daemon() ;
    $daemon -> init();
}
//这里可以是你的程序代码,我将程序代码写入了另一个文件中了,故在此加载文件
include_once __DIR__."/log_analysis.php" ;
?>

在linux系统中测试:


查看index.php文件是否在后台运行:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值