PHP-FPM动态模式核心是联动配置四参数:pm.max_children为内存安全上限,pm.start_servers≈30%该值作冷启动进程数,pm.min_spare_servers与之相等保响应,pm.max_spare_servers≈80%该值留弹性缓冲,再配pm.max_requests=5000防泄漏、request_terminate_timeout=60防卡死。

PHP 7.3 下配置 PHP-FPM 动态进程池(pm = dynamic)的核心目标是:在不触发 OOM 的前提下,让空闲进程能快速响应突发请求,又不长期占用过多内存。这不是填几个固定数字的事,而是要结合你服务器的真实资源和应用负载来定。
关键点先说清:pm.max_children 是天花板,其他参数(start_servers、min_spare_servers、max_spare_servers)必须围绕它联动设置;不能只改一个,更不能照搬网上“万能配置”。
确认当前模式与配置位置
先看清楚你实际在用什么:
- 运行
php-fpm -t或php --ini,找到正在加载的 pool 配置文件,通常是/etc/php/7.3/fpm/pool.d/www.conf - 打开该文件,搜索
pm =,确认值确实是dynamic(不是static或ondemand) - 如果是
static却想调动态参数,这一步就白做了——得先改成dynamic
计算 pm.max_children(最大子进程数)
这个值决定并发上限,也决定内存是否爆掉。
别信“默认50”或“别人设100”,按你机器实测来:
立即学习“PHP免费学习笔记(深入)”;
-
查单个 PHP 进程真实内存占用:
ps aux --sort=-%mem | grep 'php-fpm: pool www' | head -5
看
RSS列(单位 KB),取前 3 个值的中位数。比如得到92480、98600、103200→ 中位数 ≈98600 KB ≈ 96 MB -
算可用内存给 PHP-FPM:
free -h看总内存,减去:- 系统基础(留 1.5 GB)
- MySQL(同机部署至少留 2 GB)
- Nginx(约 300 MB)
剩余就是安全上限。例如总内存 8 GB → 可用约 4.2 GB
计算:
4200 MB ÷ 96 MB ≈ 43.7→pm.max_children = 43(向下取整,不四舍五入)
设置 dynamic 模式四参数(必须联动)
假设你算出 pm.max_children = 43,推荐这样配:
-
pm.start_servers = 13(≈ 43 × 0.3,冷启动时预启进程数) -
pm.min_spare_servers = 13(最低空闲数,避免新请求排队等待) -
pm.max_spare_servers = 34(≈ 43 × 0.8,留缓冲,防抖动) pm.max_children = 43
✅ 这组值逻辑清晰:启动就有 13 个可用进程;空闲时至少保持 13 个,最多留 34 个;一旦并发超 43,新请求进 listen queue 等待,不会直接 502。
补充两个重要参数(PHP 7.3 适用)
pm.max_requests = 5000
每个子进程处理 5000 个请求后自动重启,防内存缓慢泄漏。PHP 7.3 已较稳定,设太小(如 1000)反而导致频繁 fork,拖慢高并发。request_terminate_timeout = 60
防止单个脚本卡死占住进程。建议设为略高于你最长正常接口耗时(比如最慢 API 是 35s,这里设 60 安全)。
验证是否生效
改完配置,必须重启服务(不是 reload):
sudo systemctl restart php7.3-fpm
然后检查:
-
sudo systemctl status php7.3-fpm确保运行中 -
sudo ss -tuln | grep ':9000\|php.*sock'确认监听正常 - 访问
http://你的域名/status?full(需提前配好pm.status_path = /status和 Nginx 透传)看idle processes和active processes是否随压测波动
不复杂但容易忽略



















