php 7.0 fpm并发优化核心是匹配pm模式、实测内存与请求节奏:先用ps aux测rss得单进程95mb,8gb服务器留4.5gb给php-fpm→pm.max_children设45;选dynamic模式,配start_servers=10、min_spare=8、max_spare=30、max_requests=500;加request_terminate_timeout=30s等防阻塞;并启用opcache、禁用冗余扩展、调低memory_limit。

明确你的服务器资源底线
先算清楚单个 PHP 进程实际吃多少内存。别信“平均 30MB”这种老说法——PHP 7.0 + Laravel/Symfony + Composer autoload + Xdebug(哪怕没开)在真实请求下,常驻内存轻松达 80–120MB。用这个命令实测:
ps aux --sort=-%mem | grep "php-fpm" | head -10
看 RSS 列(单位 KB),取几个活跃 worker 的平均值。假设你测出是 95MB,而服务器总内存 8GB,系统+MySQL+Nginx 占用约 2.5GB,留给 PHP-FPM 的安全余量约 4.5GB → 理论最大可用进程数 ≈ 4500 ÷ 95 ≈ 47 个。这就是 pm.max_children 的硬上限,超了必 OOM。
选对 pm 模式并设合理动态参数
PHP 7.0 推荐用 pm = dynamic(非 ondemand,后者冷启动延迟高;也非 static,太死板)。按上面 47 的上限,推荐配置(写在 /etc/php/7.0/fpm/pool.d/www.conf):
-
pm.max_children = 45—— 留 2 个余量防突发 -
pm.start_servers = 10—— 启动即备好 10 个,避免首波请求排队 -
pm.min_spare_servers = 8—— 空闲低于 8 就补新进程 -
pm.max_spare_servers = 30—— 空闲高于 30 就杀掉,防闲置浪费 -
pm.max_requests = 500—— 每个进程处理 500 次请求后自动重启,防内存缓慢泄漏(PHP 7.0 仍有小概率)
收紧请求生命周期,减少阻塞
并发卡住,往往不是进程不够,而是单个请求拖太久。加这几项防“赖着不走”:
-
request_terminate_timeout = 30s—— 强制中断超时脚本(注意:比 Nginx 的fastcgi_read_timeout小 5 秒) -
request_slowlog_timeout = 5s—— 脚本执行超 5 秒记入 slow.log,方便定位瓶颈 -
rlimit_files = 65536—— 避免因文件描述符不足导致 accept 失败(配合系统级ulimit -n 65536)
必须配套的 PHP 层加固
FPM 调优见效的前提,是 PHP 本身不拖后腿:
-
强制启用 OPcache:PHP 7.0 自带,编辑
/etc/php/7.0/fpm/php.ini:opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=4000 opcache.validate_timestamps=0 ; 生产环境关时间戳检查 opcache.fast_shutdown=1
-
禁用无用扩展:运行
php -m,把imap、ftp、snmp等业务不用的扩展在php.ini里注释掉(;extension=imap.so) -
调低内存限制:若应用无大文件处理,把
memory_limit = 128M(而非 512M 或 -1),逼出潜在内存滥用问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











