设500是安全下限但易致集中重启,合理值需实测:使worker在5–15分钟内错峰达阈值,PHP 8.4下纯API可试1000,Laravel/Symfony建议600,须配合内存监控与泄漏修复。

pm.max_requests 设多少才算“够用又不翻车”
设 500 是安全下限,但对 PHP 8.4 + Laravel/Symfony 类项目来说,它大概率会引发进程集体重启——不是内存没堆积,而是重启太集中,造成秒级服务中断。真正合理的值取决于你单个 worker 的内存泄漏速度,不是拍脑袋定的。
为什么不能直接抄“1000”或“3000”
因为 pm.max_requests 不是越大越好,它本质是在“防泄漏”和“稳服务”之间找平衡点:
- 设太小(如
200):worker 处理完 200 个请求就杀掉重拉,PHP-FPM master 频繁 fork,CPU 花在重建进程上,ps aux里能看到大量php-fpm: pool www状态在S和Z间跳 - 设太大(如
0或10000):泄漏慢的框架可能撑到 2000+ 请求才明显膨胀,但一旦泄漏加速(比如某次 DB 连接未 close、某段 GD 图片处理残留资源),单个 worker RSS 就可能冲到 120MB+,OOM Killer 很快介入 - PHP 8.4 的 JIT 和 OPcache 本身更吃内存,泄漏节奏比 7.4 更难预测,盲目沿用旧值风险更高
怎么算出适合你项目的值
别猜,用真实负载测。核心逻辑是:让第一批启动的 worker 在 5–15 分钟内错峰达到 pm.max_requests,避免同步重启。
- 先临时设为
pm.max_requests = 500,跑 30 分钟线上流量(或用ab/wrk模拟) - 执行:
sudo php-fpm -t && sudo systemctl reload php-fpm-84(语法校验必须做) - 观察日志:
tail -f /www/wwwlogs/php_slow_*.log和grep "child exited" /var/log/php-fpm.log,看重启是否扎堆 - 用这个命令估算平均单 worker 生命周期(单位:秒):
ps --no-headers -o etime,cmd -C php-fpm | awk '$1>60 {sum+=$1; n++} END {print int(sum/n)}' - 如果平均存活时间 ≈ 300 秒(5 分钟),说明
500偏小;若 ≈ 1800 秒(30 分钟),可尝试提到1200;超过 3600 秒(1 小时),建议设2000并加监控
PHP 8.4 下推荐起始值与陷阱
没有万能值,但有强相关条件:
立即学习“PHP免费学习笔记(深入)”;
- 纯 API 项目(无 GD、无文件上传、无大 ORM):
pm.max_requests = 1000起步,配合php_admin_value[memory_limit] = 96M - Laravel 11 / Symfony 7 + Eloquent + Redis 缓存:
pm.max_requests = 600更稳,因 Doctrine Proxy 和 Event Dispatcher 容易隐式累积引用 - 开了 Xdebug 或未关 OPcache validate(
opcache.validate_timestamps=1):哪怕设成300也救不了——先禁用扩展再调参 - 宝塔面板用户注意:
pm.max_requests必须写在对应 PHP 版本的www.conf里(路径类似/www/server/php/84/etc/php-fpm.d/www.conf),改错文件等于白干
最常被忽略的一点:这个参数只在 worker 处理完指定请求数后触发重启,但它不解决根本泄漏源。如果 ps aux --sort=-%mem | head -5 显示某个 worker RSS 持续 >100MB,说明代码里有显式资源未释放,pm.max_requests 只是兜底,不是替代方案。



















