PHP守护进程创建的标准流程
什么是守护进程?
守护进程是运行在后台并且不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。
守护进程创建的标准流程:
- 调用umask设置文件创建的掩码
- fork子进程并关闭父进程
- 调用posix_setsid创建新会话
- 把当前工作目录切换为根目录
- 把不需要的文件描述符全部关闭
- 标准输入输出错误重定向
【除了背景色标注项外,其它的其实都是可选项】
守护进程PHP代码骨架
function daemon() { umask(0); $pid = pcntl_fork(); if ($pid > 0) { exit(0); } elseif ($pid < 0) { printf("fork failed"); } posix_setsid(); $pid = pcntl_fork(); if ($pid > 0) { exit(0); } elseif ($pid < 0) { printf("fork failed"); } }
代码说明:
【1】把一个进程变成守护进程,首先要让该进程脱离当前的控制终端,要达到这个目的需要调用posix_setsid
。
【2】我们的代码为什么在调用posix_setsid
之前要fork
一次呢? 这是因为调用posix_setsid
的进程必须不能是session leader,
为了确保万无一失,会先fork
一个子进程,
fork
出来的子进程就必然不是session leader
了。
【3】我们的代码为什么在调用posix_setsid
之后还要再fork
一次呢? 其实这不是必须的,nginx
在实现daemon
时就没有fork
两次,很多daemon
的实现都没有fork
两次, 这是因为在某些sysv system
上,子进程会重新获得终端,再fork
一次, 子进程就不是session leader
了,从而避免守护进程打开控制终端。
版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。
本文链接:PHP守护进程创建的标准流程
发表评论: