PHP-FPM性能优化关键在合理配置进程管理模式与参数:先观察负载(systemctl status、php-fpm -t、slowlog、错误日志),再依场景选static/dynamic/ondemand模式,科学计算max_children,配合Nginx的fastcgi超时、socket连接及缓冲设置,最后reload验证。

PHP-FPM 的性能瓶颈往往不在代码本身,而在于进程管理配置不合理。调高进程数不等于提升并发能力,关键是要匹配服务器资源与请求特征,选对 pm 模式并精细调参。
看清当前负载再动手
别一上来就改 www.conf。先用命令观察真实运行状态:
-
systemctl status php-fpm看服务是否正常、有无频繁重启 -
sudo php-fpm -t验证配置语法正确性 -
sudo tail -f /var/log/php-fpm/www-slow.log查看慢请求(需开启slowlog) -
sudo systemctl status php7.4-fpm -l(版本按实际替换)看最近错误日志
选对 pm 模式:static、dynamic 还是 ondemand?
三种模式适用场景差异明显,不是越高越好:
-
static:固定进程数,适合 CPU 密集型、请求稳定且可预估的场景。例如后台批量处理任务。设置
pm.max_children = 32后,始终占用约 32 个 PHP 进程内存。 -
dynamic:最常用。根据负载自动伸缩,兼顾响应与资源节约。推荐中小流量网站:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
注意max_requests防止内存泄漏累积。 - ondemand:空闲时几乎不占进程,启动慢但省内存。适合低频访问或内存极度紧张的环境,但突发流量下首请求延迟明显,不建议生产环境 Web 前端使用。
合理计算 max_children:别只看 CPU 核数
公式参考:max_children ≈ 总内存 × 0.7 ÷ 单个 PHP 进程平均内存
立即学习“PHP免费学习笔记(深入)”;
- 用
ps aux --sort=-%mem | grep "php-fpm" | head -10查看几个活跃进程的 RSS 内存(单位 KB) - 取平均值,比如 45MB/进程,服务器 4GB 内存 →
4096 × 0.7 ÷ 45 ≈ 63,向下取整设为60 - 同时考虑 Nginx 的
worker_connections和反向代理超时时间,避免 FPM 进程被占满后 Nginx 返回 502
配合 Nginx 做好连接控制
FPM 配置再优,Nginx 没配好也白搭:
- Nginx 的
fastcgi_pass推荐用 Unix socket(如unix:/run/php/php7.4-fpm.sock),比 TCP 更快更稳定 - 在
location ~ \.php$块中加上:
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_connect_timeout 30;
防止长请求被误杀 - 启用
fastcgi_buffering off;(慎用)仅当输出大文件或流式响应时考虑,否则关闭缓冲会增加 FPM 压力
基本上就这些。调完记得 reload 服务:sudo systemctl reload php-fpm && sudo nginx -s reload,再压测验证效果。不复杂但容易忽略细节。











