PHP 实现守护进程-php教程

资源魔 41 0

守护过程

守护过程作为一种常驻过程效劳,很常见,例如 PHP-FPM, NGINX,REDIS,都需求一个父过程来支持整个效劳。然而用 PHP 编写守护过程没有多见,明天就来用 PHP 来完成一下。

步骤

● fork 子过程

● 父过程加入

● 设置新的会话

● 重置文件掩码

● 封闭规范输出输入

完成

咱们对着以上的步骤来完成,正在这以前需求 pcntl 以及 posix 扩大,请确保装置了。

function daemon() {
    $pid = pcntl_fork();
    // fork 失败
    if ($pid < 0) {
        exit('fork failed');
    } else if ($pid > 0) {
       // 加入父过程
        exit(0);
    }
    // 设置新的会员
    // setsid 有几个留意点
    // 不克不及是过程组的组长挪用
    // 关于过程组组员挪用会孕育发生新的会话以及过程组,并成为该过程组的惟一成员,挪用的过程将脱离终端
    if (posix_setsid() < 0) {
        exit('set sid failed');
    }
    // 重置文件掩码
    umask(0);
    // 切换工作目次
    chdir('/');
    // 封闭规范输出输入
    fclose(STDIN);
    fclose(STDOUT);
    fclose(STDERR);
}

细节

// 猎取过程ID
var_dump(posix_getpid());
// 猎取过程组ID
var_dump(posix_getpgid(posix_getpid()));
// 猎取过程会话ID    
var_dump(posix_getsid(posix_getpid()));

三者后果相反,阐明了该过程即便过程组的组长,也是会话领袖。

为何需求 umask (0)

当你正在 linux 挪用 umask 的时分你会看到一个掩码值,这个掩码决议了你创立文件权限范畴,例如自己以后机械的 umask 为

0022

文件的最年夜权限是 0666,而目次的最年夜权限是 0777, 那末以后用户的创立的目次权限就是 0755,关于以后用户而言就是 rwx-rx-rx 权限。而文件则是 0644,关于以后用户而言 rw-r-r 权限。以是假如不重置掩码的话,那末关于目次而言就是 0755,而文件则是 0644 了。

留意

假如你正在过程应用了 echo var_dump 等函数,肯定要把规范输入等重定向到其余文件流中。新添加上面代码就能够了。

global $stdin, $stdout, $stderr;
$stdin = fopen('/dev/null', 'r');
$stdout = fopen('/www/php/txt.txt','wb');
$stderr = fopen('/dev/null', 'wb');

由于正在下面曾经封闭了规范输出输入,此时文件形容符 fd 曾经不,一切从新关上之后 fd 从非负开端顺次是 0,1,2。正好作为规范输出输入的文件。当然重定向到哪里需求你本人设置。

最初的二次 fork

这个成绩需求好好推敲,由于长短必需的。今朝想没有到有甚么场景下必需两次 Fork。

以上就是PHP 完成守护过程的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!