PHP-fpm

PHP-fpm

介绍

PHP-FPM(FastCGI Process Manager)是一个PHP FastCGI 进程管理器。FastCGI
可以理解为一种协议,用于web服务器(nginx、Apache)和处理程序间进行通信,是一种应用层通信协议。

从PHP5.3.3开始集成了php-fpm模块,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有
效控制内存和进程、可以平滑重载PHP配置。

PHP-fpm的工作原理

启动php-fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。当有客户端来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列有多长,由listen.backlog
配置。

当nginx作为服务器时PHP-fpm的工作原理

用户发送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,php-cgi,php-fpm,fastcgi的区别?

  • 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有几种工作模式?

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,不适合大流量模式

怎么选定php-fpm的worker进程数?

动态建立进程个数

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如何优化?

  • 避免程序跑死:在负载较高的服务器上定时重载php-fpm,reload可以平滑重启而不影响生产系统的php脚本运行,每15分钟reload一次。

  • 合理增加单个worker进程最大处理请求数,减少内存消耗:最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn新的。该配置可以避免php解释器自身或程序引起的memory leaks。

  • 开启静态模式,指定数量的php-fpm进程,减少内存消耗

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龍九^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值