欢迎大家访问博主的博客新家:IT博客达人网 (http://www.blogdaren.com)[耶]

PHP守护进程创建的标准流程

manon 2018-3-20 16:13 PHP 抢沙发 125人打酱油 打开侧边栏| 关闭侧边栏

什么是守护进程?

守护进程是运行在后台并且不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。

守护进程创建的标准流程:

  • 调用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,从而避免守护进程打开控制终端



正文部分到此结束

版权声明:除非注明,本文由( manon )原创,转载请保留文章出处

本文链接:PHP守护进程创建的标准流程

继续浏览:木有标签

socket_create和stream_socket_server创建出来的socket有啥区别?
CentOS使用pv(Pipe Viewer)命令查看执行进度

发表评论

看看右边的头像对不对?→_→