PHP-fpm 介绍 PHP-FPM(FastCGI Process Manager)是一个php FastCGI 进程管理器。FastCGI 可以理解为一种协议,用于WEB服务器(Nginx、A
PHP-FPM(FastCGI Process Manager)是一个php FastCGI 进程管理器。FastCGI
可以理解为一种协议,用于WEB服务器(Nginx、Apache)和处理程序间进行通信,是一种应用层通信协议。从PHP5.3.3开始集成了php-fpm模块,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有
效控制内存和进程、可以平滑重载PHP配置。
启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。当有客户端来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列有多长,由listen.backlog
配置。
用户发送Http请求报文给nginx服务器,因为nginx本僧并不能解析php脚本,所以nginx会根据文件URL和后缀来判断请求,如果请求是静态内容,nginx会将结果直接返回给用户,如果请求的是动态内容,nginx会将请求转交给fastcgi客户端,通过fastcgi_pass将这个请求交给PHP-fpm处理,这个时候如果PHP-fpm被停止的话会报一个502的错误,PHP-fpm接受到请求会通过本地监听的Socket交给work,work收到请求会生成新的线程调用PHP动态程序解析服务器去处理程序,PHP会将处理过后的结果交给nginx,最后,nginx会生成一个响应报文返还给用户。
cgi:cgi是一个web
server与cgi程序(这里可以理解为是php解释器)之间进行数据传输的协议,保证了传递的是标准数据。
php-cgi:php-cgi是php解释器。他自己本身只能解析请求,返回结果,不会管理进程。php-fpm是调度管理php-cgi进程的程序。
Fastcgi:Fastcgi是用来提高cgi程序(php-cgi)性能的方案/协议。cgi程序的性能问题在哪呢?“PHP解析器会解析php.ini文件,初始化执行环境”,就是这里了。标准的CGI对每个请求都会执行这些步骤,所以处理的时间会比较长。Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复劳动,效率自然提高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。
php-fpm:fastcgi是一个方案或者协议,php-fpm就是FastCGI的后端实现,也就是说,进程分配和管理是FPM来做的。官方对FPM的解释:【FastcgiProcess Manager】【Fastcgi进程管理器】。php-fpm的管理对象是php-cgi,他负责管理一个进程池,来处理来自Web服务器的请求。对于php.ini文件的修改,php-cgi进程是没办法平滑重启的,有了php-fpm后,就把平滑重启成为了一种可能,php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度的。
PHP-FPM进程管理方式有动态(Dynamic)、静态(Static)、按需分配(Ondemand)三种。
动态工作模式会初始化创建一部分worker,在运行过程中,动态调整worker数量,最大worker数受pm.max_children和process.max的限制
listen = 127.0.0.1:9001
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
当空闲进程数小于min_spare_servers时,创建新的子进程,总子进程数小于等于pm.max_children,小于等于process.max,当空闲进程数大于max_spare_servers,会杀死启动时间最长的子进程,如果子进程(idle状态)数大于max_children,会打印warning日志,并且结束处理,process小于
max_children
,计算一个num,启动num个worker,优点:动态扩容,不浪费系统资源,缺点:所有worker都在工作,新的请求到来需要等待创建worker进程,最长等待1s(内部存在一个1s的定时器,去查看,创建进程),频繁启停进程消耗cpu,请求数稳定,不需要频繁销毁
启动固定大小数量的worker,也有1s的定时器,用于统计进程的一些状态信息,例如空闲worker个数,活动worker个数,优点:不用动态判断负载,提升性能,缺点:如果配置成static,只需要考虑max_children数量,数量取决于cpu的个数和应用的响应时间,一次启动固定大小进程浪费系统资源
php-fpm启动的时候不会启动worker进程,按需启动worker,有链接进来后,才会启动
listen = 127.0.0.1:9001
pm = ondemand
pm.process_idle_timeout = 60
pm.max_children = 10
连接到来时(只有链接,不没有数据也会创建,telnet也会创建),创建新worker进程,worker进程数的创建收max_children设置限制,也受限于全局的process.max设置,如果空闲时间超过了process_idle_timeout的设置就会销毁worker进程,优点:按流量需求创建,不浪费系统资源,缺点:因为php-fpm是短连接的,如果每次请求都先建立连接,大流量场景下会使得master进程变得繁忙,浪费cpu,不适合大流量模式
动态建立进程个数
N+20% 到 M/m之间
N是 cpu 核数,M是内存,m是每个 php 进程内存数
静态建立进程个数
M/(m*1.2)
pm.max_requests,设置最大请求数,达到这个数量以后,会自动长期worker进程,繁殖内存意外增长
注意:
PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M。所以需要每个worker进程处理完一定的请求后,销毁重新创建。
cpu密集型的pm.max_children不能超过cpu内核数,但是web服务属于io密集型的,可以将pm.max_children的值设置大于cpu核数。
避免程序跑死:在负载较高的服务器上定时重载php-fpm,reload可以平滑重启而不影响生产系统的php脚本运行,每15分钟reload一次。
合理增加单个worker进程最大处理请求数,减少内存消耗:最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn新的。该配置可以避免php解释器自身或程序引起的memory leaks。
开启静态模式,指定数量的php-fpm进程,减少内存消耗
来源地址:https://blog.csdn.net/m0_66412572/article/details/125956848
--结束END--
本文标题: PHP-fpm
本文链接: https://lsjlt.com/news/386817.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0