守护过程
守护过程作为一种常驻过程效劳,很常见,例如 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开发自学
抱歉,评论功能暂时关闭!