PHP-FPM(FastCGI Process Manager)是PHP的FastCGI进程管理器,是现代PHP应用架构中核心的进程管理组件。
核心定位与发展
它最初是PHP源码的第三方补丁包,从PHP 5.3.3版本开始被集成到PHP官方核心代码中,不再需要单独安装补丁。相比传统的Spawn-FCGI和mod_php,它提供了更优秀的进程管理、内存控制能力,还支持平滑重载配置,目前已经成为Nginx+PHP架构的标准配置。
核心架构
采用经典的Master + Worker多进程架构:
- Master主进程:仅负责解析配置、管理工作进程、接收控制信号,不处理实际请求
- Worker工作进程:每个进程是独立的单线程,负责实际执行PHP脚本、处理FastCGI请求,进程间相互独立,一个崩溃不影响其他进程,稳定性更高。
三种核心进程管理模式
PHP-FPM提供三种进程管理模式,适用于不同场景:
- static(静态)
- 描述:启动时创建固定数量的Worker进程,全程保持数量不变。
- 使用场景:高并发、负载稳定的生产服务器,比如单一用途的API服务,内存可预测且无创建延迟。
- dynamic(动态)
- 描述:Worker数量在最小-最大范围内动态伸缩,根据负载自动调整。
- 使用场景:大多数通用场景,是多数发行版的默认选项,缺点是流量突变时会有创建延迟。
- ondemand(按需)
- 描述:请求到达时才创建Worker,空闲超时后自动销毁。
- 使用场景:低流量、内存资源紧张的服务器,内存占用最低,但冷请求会增加5-50ms延迟。
核心性能调优要点
最关键的参数是pm.max_children,它决定了服务器能同时处理多少PHP请求:
- 计算公式:pm.max_children = (总内存 - 系统预留内存) / 单个Worker平均常驻内存
- 常见错误:盲目设置过大值会导致系统内存耗尽,触发OOM杀死进程,反而让性能急剧下降
- CPU密集型场景:Worker数量建议不超过vCPU核心数 * 2-4,超过后会导致空转浪费资源
与Nginx的协作流程
- Nginx接收用户的HTTP请求,判断是PHP脚本后,通过FastCGI协议将请求转发给PHP-FPM监听的Socket/端口
- PHP-FPM的Master进程把请求分配给一个空闲的Worker进程
- Worker执行PHP代码,生成响应后原路返回给Nginx,再由Nginx返回给用户浏览器