前言
通过本文可以了解到cli和fpm模式的生命周期、以及fastcgi协议。
cli模式
就是命令行模式
cli模式的生命周期一共有5大阶段:
- php_module_startup //模块初始化阶段
- php_request_startup //请求初始化阶段
- php_execute_script //脚本执行阶段(读取你的代码,进行解析)
- php_request_shutdown //请求关闭阶段
- php_module_shutdown //模块关闭阶段
网络编程基础知识
server端需要经过哪些步骤才能准备好接受client请求呢?一共分三步
- socket(创建fd)
- bind(绑定)
- listen(开始监听)
- accept(一般这步是死循环,接受请求,如果没有请求的时候,会挂起,进入阻塞阶段)
FPM模式
经常在生产环境用的php-fpm,fastcgi协议,一般是通过nginx转到php-fpm上
运行的三种模式:
- pm=static //静态模式 始终会保持一个固定数量的子进程 pm.max_children指定
- pm=dynamic //动态模式 通过 pm.start_servers和pm.max_children指定,分别代表启动子进程的初始值和最大值;还支持pm.min_spare_servers和pm.max_spare_servers,分别代表闲置子进程的最小值和最大值
- pm=ondemand //按需要的模式 和动态模式正好相反,它是把内存放在第一位的,每个闲置进程都会在一定时间后被释放,这个值可以通过pm.process_idle_timeout指定;好处就是,服务请求低峰期时,内存就会降下来,极端情况,如果长时间没有请求,就会只剩一个子进程;而高峰期呢,就无法避免频繁的创建子进程问题。
fpm模式生命周期:
需要注意的1点:只有在整个fpm退出的时候才会执行php_module_shutdown
cli模式和fpm模式生命周期的区别
1:fpm增加了一些额外的,网络编程相关的事情
2:fpm在php_request_shutdown和php_request_startup之前做了一个死循环,会一直循环,因为是常驻内存。
FastCGI协议
浏览器发送一个请求到Apache或nginx,这个时候用的是http协议,然后nginx通过fastcgi协议传送到fpm;
fpm解析执行完再通过fastcgi协议返回给nginx,nginx再把它转成http协议,转给浏览器,然后浏览器就可以开始解析、展示。
fastcgi input和output协议
参数解析
Begin Request:
代表请求的开始;
body的长度由header里面的字段来指定的;
Params Begin:
代表参数的开始;
是http协议中的key value 对,然后又变成了一个string,放在body中,长度也是由heade里面的字段来指定;
Params End:代表参数的结束;
和Params Begin header一样,只不过长度等于0,代表的是结束
Stdin header:如果有长度,会带一个body,否则代表结束
Stdout:这里的body和http协议中的一样,**key:value;**长度也是由header中的字段来指定
End Request:代表请求结束
FCGI_Header
typedef struct {
unsigned char version; // 版本号
unsigned char type; // 记录类型
unsigned char requestIdB1; // 记录id高8位
unsigned char requestIdB0; // 记录id低8位
unsigned char contentLengthB1; // 记录内容长度高8位
unsigned char contentLengthB0; // 记录内容长度低8位
unsigned char paddingLength; // 补齐位长度
unsigned char reserved; // 真·记录头部补齐位
} FCGI_Header;
fastcgi与cgi
1)CGI 和 FastCGI 都只是一种通信协议规范,不是一个实体,一般说的CGI指的是用各种语言编写的能实现该功能的程序
2)CGI 程序和FastCGI程序,是指实现这两个协议的程序,可以是任何语言实现这个协议的。(PHP-CGI 和 PHP-FPM就是实现FastCGI的程序)
3)CGI程序和FastCGI程序的区别:
关于CGI程序:
CGI使外部程序与Web服务器之间交互成为可能。CGI程序运行在独立的进程中,并对每个Web请求建立一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请求,进程的大量建立和消亡使操作系统性能大大下降。此外,由于地址空间无法共享,也限制了资源重用。
关于FastCGI程序:
与CGI程序为每个请求创建一个新的进程不同,FastCGI使用持续的进程(master)来处理一连串的请求。这些进程由FastCGI服务器管理,而不是web服务器。 当进来一个请求时,web服务器把环境变量和这个页面请求通过一个socket或者一个TCP connection传递给FastCGI进程。
涉及到的面试题
1:kill master进程号,这个时候子进程还能接受请求么?
答案:不能,已经没有子进程了
2:kill -9 master进程号,这个时候还能服务么?
答案:可以
3:kill worker进程号,这个时候还能服务么?
答案:可以,master检测到worker挂了,会重新拉起来。
补充知识:
master的作用是什么?
答:master只是起到管理worker的作用,不会接受请求,请求完全由worker处理,如果worker挂了,master会把它重新拉起来
kill和kill -9的区别
直接kill:一般不加参数kill是使用15来杀,这相当于正常停止进程,停止进程的时候会释放进程所占用的资源;他们的区别就好比电脑关机中的软关机(通过“开始”菜单选择“关机”)与硬关机(直接切断电源),虽然都能关机,但是程序所作的处理是不一样的;
kill -9:表示强制杀死该进程;
执行kill命令,系统会发送一个SIGTERM信号给对应的程序。SIGTERM多半是会被阻塞的。kill -9命令,系统给对应程序发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。