php运行的生命周期

前言

通过本文可以了解到cli和fpm模式的生命周期、以及fastcgi协议。

cli模式

就是命令行模式
cli模式的生命周期一共有5大阶段

  1. php_module_startup //模块初始化阶段
  2. php_request_startup //请求初始化阶段
  3. php_execute_script //脚本执行阶段(读取你的代码,进行解析)
  4. php_request_shutdown //请求关闭阶段
  5. php_module_shutdown //模块关闭阶段

网络编程基础知识

server端需要经过哪些步骤才能准备好接受client请求呢?一共分三步

  1. socket(创建fd)
  2. bind(绑定)
  3. listen(开始监听)
  4. accept(一般这步是死循环,接受请求,如果没有请求的时候,会挂起,进入阻塞阶段)

FPM模式

经常在生产环境用的php-fpm,fastcgi协议,一般是通过nginx转到php-fpm上

运行的三种模式:

  1. pm=static //静态模式 始终会保持一个固定数量的子进程 pm.max_children指定
  2. pm=dynamic //动态模式 通过 pm.start_servers和pm.max_children指定,分别代表启动子进程的初始值和最大值;还支持pm.min_spare_servers和pm.max_spare_servers,分别代表闲置子进程的最小值和最大值
  3. 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协议
左边是input 协议
参数解析
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能顺利杀掉进程。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值