PHP生命周期

@爱耍流氓的唐僧  February 1, 2021

PHP生命周期:
1396248108-5b97c8f268366_articlex.png

什么是SAPI?
Server Application Programming Interface 的首字母缩写,意思是服务器端应用编程接口,这是PHP内核提供给外部调用其服务的接口,即外部系统可以通过SAPI来调用PHP提供的编译脚本、执行脚本的服务。PHP中实现的SAPI很多,CLI,Fpm是我们比较常见。

外部系统是如何通过SAPI调用PHP服务的
9yQvSUSUU6-compress.jpg

Cli
Cli(Command Line Interface),即命令行接口,用于在命令行下执行 PHP 脚本,就像 Shell 那样,它是执行 PHP 脚本最简便的一种方式。
Cli 是单进程模式,处理完请求后就直接关闭了,生命周期先后经历 module startup、request startup、execute script、request shutdown、module shutdown,其执行流程比较简单,关键的处理过程如下:

main()-> php_cli_startup()-> do_cli()-> php_module_shutdown()

FPM
FPM(FastCGI Process Manager)是 PHP FastCGI 运行模式的一个进程管理器,Fpm的核心功能是进程管理。
FastCGI 是 Web 服务器(如Nginx、Apache)和处理程序之间的一种通信协议,它是与HTTP类似的一种应用层通信协议。(它是一种协议)
FPM 是一种多进程模型,它由一个 master 进程和多个 worker 进程组成。master 进程启动时会创建一个 socket,但是不会接收、处理请求,而是由 fork 出的 worker 子进程完成请求的接收及处理。即 master 进程管理 worker 进程,而 worker 进程才是真正的处理请求。
FPM在启动后首先会进行 SAPI 的注册操作;接着会进入 PHP 生命周期的 module startup 阶段,在这个阶段会调用各个扩展定义的 MINT 钩子函数。然后会进行一系列的初始化操作,最后 master、worker 进程进入不同的处理环节。
无标题.png

其生命周期主要经历这几个阶段:等待请求、解析请求、请求初始化、执行 PHP 脚本、关闭请求。
master 进程主要通过三种不同的方式来管理 worker 进程,分别是静态模式(static)、动态模式(dynamic)、按需模式(ondemand)。具体要使用哪种模式可以在conf配置中通过pm指定。
1.static模式
static模式始终会保持一个固定数量的子进程,这个数量由pm.max_children定义。

2.dynamic模式
子进程的数量是动态变化的,启动时,会生成固定数量的子进程,可以理解成最小子进程数,通过pm.start_servers控制,而最大子进程数则由pm.max_children控制,子进程数会在pm.start_servers~pm.max_children范围内波动,另外,闲置的子进程数还可以由pm.min_spare_servers和pm.max_spare_servers两个配置参数控制。换句话说,闲置的子进程也可以由最小数目和最大数目,而如果闲置的子进程超过pm.max_spare_servers,则会被杀掉。

3.ondemand模式
这种模式和dynamic模式相反,把内存放在第一位,每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被杀掉。有了这个模式,到了服务器低峰期,内存自然会降下来,如果服务器长时间没有请求,就只有一个主进程,当然其弊端是,遇到高峰期或者pm.process_idle_timeout设置太小,无法避免服务器频繁创建进程的问题。

对于我们的服务器,选择哪种执行方式比较好呢?
事实上,跟Apache一样,我们运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。所以,动态方式因为会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据内存/20M得到。比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。然后对于比较大内存的服务器来说,设置为静态的话会提高效率。因为频繁开关php-fpm进程也会有延迟,所以内存够大的情况下开静态效果会更好。数量也可以根据内存/30M得到。比如说2GB内存的服务器,可以设置为50;4GB内存可以设置为100等。


添加新评论