php-fpm初始化失败,FPM的初始化 - [ PHP7的内核剖析 ] - 在线原生手册 - php中文网
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中文网相关推荐
- mysql 数据库初始化失败怎么办,MYSQL初始化错误方式详解
mysql初始化错误[一] MySQL 初始化DATA报错 [ERROR] InnoDB: io_setup() failed with EAGAIN after 5 attempts. [ERROR ...
- 总结—什么妖引起的MongoDB副本集初始化失败?
前言: 在之前搭建MongoDB集群中,遇到过一些小问题作妖引起的初始化副本集失败,初学至今踩过来的坑,在此做个小结. 1.IP错误引起MongoDB副本集初始化失败 这个错误在另一篇文章已经描述过, ...
- Visual Studio提示Bonjour backend初始化失败
Visual Studio提示Bonjour backend初始化失败 错误信息:The Bonjour backend failed to initialize, automatic Mac Bui ...
- 初始化java工具失败,spring初始化失败解决办法
spring初始化失败 报错: 00:34:33,066 INFO [main] ClassPathXmlApplicationContext:513 - Refreshing org.spring ...
- java io null异常,java.io.IOException:所有收集器的初始化失败。最后一个收集器中的错误是:null...
我是MapReduce的新手,我试图找到问题的解决方案.我试图链接两个地图reduce作业.第一份工作正在执行,但在第二份工作上我是得到一个错误如下java.io.IOException:所有收集器的 ...
- 【postgresql初始化失败】initdb: invalid locale settings; check LANG and LC_* environment variables(之二)
背景 此前,曾写过一篇文章,解决描述的问题. [postgresql初始化失败]initdb: invalid locale settings: check LANG and LC_* environ ...
- 【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 ...
- Windows 7 提示AtBroke.exe初始化失败
早上公司上班.Windows 7系统启动.登录系统发现提示一个:"AtBroker.exe初始化失败" 紧接着就提示Shell32.DLL加载出现异常.这种情况出现倒是第一次 截图 ...
- vue vuex 挂载_vue.js,javascript_Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了!,vue.js,javascript - phpStudy...
Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了! 代码如下 import 'babel-polyfill' import Vue from 'vue' import VueRouter fr ...
最新文章
- linux access函数判断文件存取权限
- 读书笔记|如何让用户为你的产品尖叫
- 浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案
- 索尼因需量大增而增加PSVR产量
- 如何用 Redis 实现延迟队列?
- 网页设计相关计算机语言,title(计算机语言)
- 高精地图中地面标识识别技术历程与实践
- qt 串口粘包_QT C++ TCP大文件高效传输高效 解决粘包问题
- 【比较】2022 程式语言排名与分析,该学习哪一种程式语言?
- dw html图片居中,dw怎么把整个表格居中 怎么在dw里面把整个网页居中?
- 高斯消元(解线性方程组)
- SDN相关组织之ODL(opendaylight)
- 可能是国内最火的开源项目 —— PHP 篇
- 第四章 Cesium学习入门之加载离线影像图(tif)
- python做表格教程_表格函数教程
- 毕业论文word排版技巧
- 微信公众号开发 如何发布图文并茂的文章?
- FPS 游戏自瞄原理
- 浙大版《C语言程序设计(第3版)》题目集 练习2-12 输出华氏-摄氏温度转换表 (15 分)...
- 如何用python进行相关性分析_如何利用python进行时间序列分析
热门文章
- 冰雪复古鸿蒙碎片哪里出,冰雪复古:玩法攻略,如何高爆率搞回收!
- 五子棋项目结束总结_居家活动系列总结
- python教程简书_Python快速教程
- BugkuCTF-WEB题秋名山车
- c语言程序设计安徽区笔试部分,2021年安徽省二级C语言程序设计笔试样题-20210419093521.doc-原创力文档...
- 串口服务器信号连接不上,使用RS485串口服务器经常遇到的问题
- 计算机图形学学习报告,计算机图形学学习报告.doc
- scanf()函数错误把输入缓存里的回车作为一次字符输入
- 对外经贸大学计算机应用基础,对外经贸大学计算机应用基础试题.doc
- php关联图片,PHP关联链接添加方法