应优先选dynamic模型并合理调参;static适合内存充足且并发稳定场景;dynamic需调大初始进程数、禁用过短idle超时;slowlog需设1s阈值并配terminate超时;opcache需匹配revalidate_freq与validate_timestamps;max_requests建议设1000–3000防内存泄漏。

php-fpm 进程模型选 static 还是 dynamic?
选错模型是性能瓶颈最常见的根源。static 模式下 pm.max_children 固定,适合内存充足、并发稳定的服务(比如内部 API);dynamic 更常见,但默认配置极不适用生产——pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 都偏小,导致高峰期频繁 fork 子进程,CPU 和响应延迟双双飙升。
- 查看当前负载:用
ps aux | grep 'php-fpm:' | wc -l对比pm.max_children值,若常接近或打满,说明进程数不足 - dynamic 模式建议初调值(以 4GB 内存服务器为例):
pm.start_servers = 8、pm.min_spare_servers = 6、pm.max_spare_servers = 12、pm.max_children = 32 - 禁用
pm.process_idle_timeout(默认未启用),若开启且设得太短(如 10s),会导致空闲进程被过早回收,反而增加 fork 开销
slowlog 怎么开才真能定位卡点?
开了 slowlog 却只看到“脚本执行超时”,基本等于没开。关键在两处:触发阈值要合理,日志格式要带上下文。
- 设置
request_slowlog_timeout = 1s(别用默认的 0 或 5s),配合slowlog = /var/log/php-fpm-slow.log - 必须启用
request_terminate_timeout并设为略大于 slowlog 值(如request_terminate_timeout = 1.5s),否则慢请求会持续占着 worker 不释放 - 日志里看不到完整堆栈?在 php.ini 中确认已开启
zend_extension=opcache.so且opcache.enable_cli=1(部分环境 CLI 模式下需显式开启)
opcache + php-fpm 协同调优的关键参数
opcache 不是开就完事,和 php-fpm 的生命周期不匹配时,反而引发缓存失效风暴。
-
opcache.revalidate_freq = 60是安全起点,但若代码更新极少(如 Docker 镜像部署),可设为 0,避免每次请求都 stat 文件 -
opcache.max_accelerated_files必须 ≥ 项目实际 PHP 文件数(可用find /path/to/app -name "*.php" | wc -l估算),低于此值会导致频繁踢出缓存 - 关键但易忽略:
opcache.validate_timestamps = 0仅在opcache.revalidate_freq = 0时生效;若两者冲突,opcache 仍会每秒检查文件修改时间
max_requests 设太大会导致内存泄漏累积
pm.max_requests 是防内存泄漏的保险丝,但设成 0 或极大值(如 10000)等于放弃防护。
- 默认值 0 表示永不重启 worker,一旦某扩展或代码有隐式内存增长(如未 unset 的大数组、PDO 长连接未 close),worker 进程 RSS 会缓慢上涨,最终 OOM
- 生产建议值:1000–3000,视单次请求平均内存增长量而定;可通过
php-fpm -t && systemctl reload php-fpm后观察ps aux --sort=-%mem | head -10中 php-fpm 进程 RSS 是否随运行时间上升 - 注意:该值重置的是 worker 生命周期,不影响 opcache 共享内存,所以不必担心缓存清空
真正卡住性能的,往往不是某个参数调得多高,而是多个机制之间互相抵触——比如 opcache 关了 timestamp 校验,但 php-fpm 却开着 pm.status_path 并被监控脚本高频轮询,结果每次请求都触发一次无意义的共享内存读取。这类细节,得看日志、看内存、看 strace,不能只信文档里的“推荐值”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











