FPM的初始化

接下来看下fpm的启动流程,从main()函数开始://sapi/fpm/fpm/fpm_main.cint main(int argc, char *argv[]){

...    //注册SAPI:将全局变量sapi_module设置为cgi_sapi_module

sapi_startup(&cgi_sapi_module);

...    //执行php_module_starup()

if (cgi_sapi_module.startup(&cgi_sapi_module) == FAILURE) {        return FPM_EXIT_SOFTWARE;

}

...    //初始化

if(0 > fpm_init(...)){

...

}

...

fpm_is_running = 1;

fcgi_fd = fpm_run(&max_requests);//后面都是worker进程的操作,master进程不会走到下面

parent = 0;

...

}

fpm_init()主要有以下几个关键操作:

(1)fpm_conf_init_main():

解析php-fpm.conf配置文件,分配worker pool内存结构并保存到全局变量中:fpm_worker_all_pools,各worker pool配置解析到fpm_worker_pool_s->config中。

(2)fpm_scoreboard_init_main(): 分配用于记录worker进程运行信息的共享内存,按照worker pool的最大worker进程数分配,每个worker pool分配一个fpm_scoreboard_s结构,pool下对应的每个worker进程分配一个fpm_scoreboard_proc_s结构,各结构的对应关系如下图。

(3)fpm_signals_init_main():static int sp[2];int fpm_signals_init_main(){    struct sigaction act;

//创建一个全双工管道

if (0 > socketpair(AF_UNIX, SOCK_STREAM, 0, sp)) {        return -1;

}    //注册信号处理handler

act.sa_handler = sig_handler;

sigfillset(&act.sa_mask);    if (0 > sigaction(SIGTERM,  &act, 0) ||        0 > sigaction(SIGINT,   &act, 0) ||        0 > sigaction(SIGUSR1,  &act, 0) ||        0 > sigaction(SIGUSR2,  &act, 0) ||        0 > sigaction(SIGCHLD,  &act, 0) ||        0 > sigaction(SIGQUIT,  &act, 0)) {        return -1;

}    return 0;

}

这里会通过socketpair()创建一个管道,这个管道并不是用于master与worker进程通信的,它只在master进程中使用,具体用途在稍后介绍event事件处理时再作说明。另外设置master的信号处理handler,当master收到SIGTERM、SIGINT、SIGUSR1、SIGUSR2、SIGCHLD、SIGQUIT这些信号时将调用sig_handler()处理:static void sig_handler(int signo){    static const char sig_chars[NSIG + 1] = {

[SIGTERM] = 'T',

[SIGINT]  = 'I',

[SIGUSR1] = '1',

[SIGUSR2] = '2',

[SIGQUIT] = 'Q',

[SIGCHLD] = 'C'

};    char s;

...

s = sig_chars[signo];    //将信号通知写入管道sp[1]端

write(sp[1], &s, sizeof(s));

...

}

(4)fpm_sockets_init_main()

创建每个worker pool的socket套接字。

(5)fpm_event_init_main():

启动master的事件管理,fpm实现了一个事件管理器用于管理IO、定时事件,其中IO事件通过kqueue、epoll、poll、select等管理,定时事件就是定时器,一定时间后触发某个事件。

在fpm_init()初始化完成后接下来就是最关键的fpm_run()操作了,此环节将fork子进程,启动进程管理器,另外master进程将不会再返回,只有各worker进程会返回,也就是说fpm_run()之后的操作均是worker进程的。int fpm_run(int *max_requests){    struct fpm_worker_pool_s *wp;

for (wp = fpm_worker_all_pools; wp; wp = wp->next) {        //调用fpm_children_make() fork子进程

is_parent = fpm_children_create_initial(wp);

if (!is_parent) {            goto run_child;

}

}    //master进程将进入event循环,不再往下走

fpm_event_loop(0);

run_child: //只有worker进程会到这里

*max_requests = fpm_globals.max_requests;    return fpm_globals.listening_socket; //返回监听的套接字}

在fork后worker进程返回了监听的套接字继续main()后面的处理,而master将永远阻塞在fpm_event_loop(),接下来分别介绍master、worker进程的后续操作。

php-fpm初始化失败,FPM的初始化 - [ PHP7的内核剖析 ] - 在线原生手册 - php中文网相关推荐

  1. mysql 数据库初始化失败怎么办,MYSQL初始化错误方式详解

    mysql初始化错误[一] MySQL 初始化DATA报错 [ERROR] InnoDB: io_setup() failed with EAGAIN after 5 attempts. [ERROR ...

  2. 总结—什么妖引起的MongoDB副本集初始化失败?

    前言: 在之前搭建MongoDB集群中,遇到过一些小问题作妖引起的初始化副本集失败,初学至今踩过来的坑,在此做个小结. 1.IP错误引起MongoDB副本集初始化失败 这个错误在另一篇文章已经描述过, ...

  3. Visual Studio提示Bonjour backend初始化失败

    Visual Studio提示Bonjour backend初始化失败 错误信息:The Bonjour backend failed to initialize, automatic Mac Bui ...

  4. 初始化java工具失败,spring初始化失败解决办法

    spring初始化失败 报错: 00:34:33,066  INFO [main] ClassPathXmlApplicationContext:513 - Refreshing org.spring ...

  5. java io null异常,java.io.IOException:所有收集器的初始化失败。最后一个收集器中的错误是:null...

    我是MapReduce的新手,我试图找到问题的解决方案.我试图链接两个地图reduce作业.第一份工作正在执行,但在第二份工作上我是得到一个错误如下java.io.IOException:所有收集器的 ...

  6. 【postgresql初始化失败】initdb: invalid locale settings; check LANG and LC_* environment variables(之二)

    背景 此前,曾写过一篇文章,解决描述的问题. [postgresql初始化失败]initdb: invalid locale settings: check LANG and LC_* environ ...

  7. 【postgresql初始化失败】initdb: invalid locale settings; check LANG and LC_* environment variables

    The files belonging to this database system will be owned by user "postgres". This user mu ...

  8. Windows 7 提示AtBroke.exe初始化失败

    早上公司上班.Windows 7系统启动.登录系统发现提示一个:"AtBroker.exe初始化失败" 紧接着就提示Shell32.DLL加载出现异常.这种情况出现倒是第一次 截图 ...

  9. vue vuex 挂载_vue.js,javascript_Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了!,vue.js,javascript - phpStudy...

    Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了! 代码如下 import 'babel-polyfill' import Vue from 'vue' import VueRouter fr ...

最新文章

  1. linux access函数判断文件存取权限
  2. 读书笔记|如何让用户为你的产品尖叫
  3. 浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案
  4. 索尼因需量大增而增加PSVR产量
  5. 如何用 Redis 实现延迟队列?
  6. 网页设计相关计算机语言,title(计算机语言)
  7. 高精地图中地面标识识别技术历程与实践
  8. qt 串口粘包_QT C++ TCP大文件高效传输高效 解决粘包问题
  9. 【比较】2022 程式语言排名与分析,该学习哪一种程式语言?
  10. dw html图片居中,dw怎么把整个表格居中 怎么在dw里面把整个网页居中?
  11. 高斯消元(解线性方程组)
  12. SDN相关组织之ODL(opendaylight)
  13. 可能是国内最火的开源项目 —— PHP 篇
  14. 第四章 Cesium学习入门之加载离线影像图(tif)
  15. python做表格教程_表格函数教程
  16. 毕业论文word排版技巧
  17. 微信公众号开发 如何发布图文并茂的文章?
  18. FPS 游戏自瞄原理
  19. 浙大版《C语言程序设计(第3版)》题目集 练习2-12 输出华氏-摄氏温度转换表 (15 分)...
  20. 如何用python进行相关性分析_如何利用python进行时间序列分析

热门文章

  1. 冰雪复古鸿蒙碎片哪里出,冰雪复古:玩法攻略,如何高爆率搞回收!
  2. 五子棋项目结束总结_居家活动系列总结
  3. python教程简书_Python快速教程
  4. BugkuCTF-WEB题秋名山车
  5. c语言程序设计安徽区笔试部分,2021年安徽省二级C语言程序设计笔试样题-20210419093521.doc-原创力文档...
  6. 串口服务器信号连接不上,使用RS485串口服务器经常遇到的问题
  7. 计算机图形学学习报告,计算机图形学学习报告.doc
  8. scanf()函数错误把输入缓存里的回车作为一次字符输入
  9. 对外经贸大学计算机应用基础,对外经贸大学计算机应用基础试题.doc
  10. php关联图片,PHP关联链接添加方法