高并发下PHP-FPM宜选static模式,设pm.max_children为最大常驻进程数,禁用process_idle_timeout;OPcache需关闭validate_timestamps与revalidate_freq,启用file_cache;ThinkPHP缓存优先Redis+Swoole Table,路由静态化,Nginx与FPM用Unix socket并调优内核参数。

PHP-FPM 进程模型选型:static 还是 dynamic?
高并发下 pm = static 往往比 pm = dynamic 更稳,尤其在 ThinkPHP 应用内存占用较固定时。dynamic 模式下频繁 fork/spawn 子进程会加剧 CPU 和内存抖动,且 pm.max_children 实际可用值受 pm.start_servers、pm.min_spare_servers 等多参数隐式约束,容易误判容量。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
pm = static,直接设pm.max_children为可承受的最大常驻进程数(如 64 或 128),避免动态伸缩开销 - 每个 PHP-FPM worker 内存按 ThinkPHP 实际压测值估算(含 OPcache、Redis 扩展等),留 20% 余量;例如单进程占 40MB,则 8GB 内存服务器最多配
pm.max_children = 160 - 禁用
pm.process_idle_timeout(仅 dynamic 模式有效),它在 high-concurrency 场景下可能触发非预期的进程回收
OPcache 配置必须关闭 validate_timestamps
ThinkPHP 的路由、配置、模板编译结果高度依赖 OPcache 缓存,而默认开启的 opcache.validate_timestamps = 1 会让每次请求都 stat 文件修改时间——这在千万级并发下会直接打爆 ext4 的 inode cache 或引发大量磁盘 I/O 等待。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
-
opcache.validate_timestamps = 0,上线后通过opcache_reset()或kill -USR2信号手动刷新缓存 -
opcache.revalidate_freq = 0(即使 validate_timestamps=0,该值也需显式设为 0) -
opcache.max_accelerated_files至少设为 65536,ThinkPHP 5.1+ 的类自动加载 + 模板编译易突破默认 2000 限制 - 启用
opcache.file_cache(如/tmp/opcache),FPM 进程重启后可快速热加载,减少冷启抖动
ThinkPHP 自身缓存驱动要避开 file,优先用 Redis + Swoole Table
默认 cache.type = file 在高并发下会产生海量小文件锁争用(flock),cache.type = redis 虽好,但若所有缓存(包括 config、route、lang)全走 Redis,单实例易成瓶颈。更优解是分层:核心元数据进 Swoole Table(内存级),业务缓存走 Redis。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 关闭
app_debug = true,否则 ThinkPHP 会强制绕过大部分缓存并写日志,性能断崖下跌 - 路由缓存改用
php think route:export生成静态 PHP 数组,配合Route::import()加载,彻底脱离运行时解析 - 使用
Swoole\Table存储高频只读数据(如状态码映射、地区字典),比 Redis 减少网络往返和序列化开销 - Redis 连接务必用
pconnect(或 predis 的 persistent connection),避免每次请求新建 TCP 连接
FastCGI 参数与 Nginx 协同调优的关键点
Nginx 的 fastcgi_pass 若直连 127.0.0.1:9000,在万级并发时会因 TIME_WAIT 堆积和端口耗尽导致 502;而 Unix socket 虽快,但权限/路径错误会导致静默失败,排查困难。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- FPM 监听改用
listen = /var/run/php-fpm.sock,Nginx 中对应fastcgi_pass unix:/var/run/php-fpm.sock - 设置
listen.owner = www-data、listen.group = www-data、listen.mode = 0660,避免 502 因权限拒绝 - Nginx 端增加
fastcgi_buffering off(对大响应体)或调大fastcgi_buffers(如256 4k),防止 FPM 发送缓冲区满导致连接卡住 - 内核参数同步调优:
net.core.somaxconn = 65535、net.ipv4.tcp_tw_reuse = 1,否则 FPM backlog 队列溢出直接丢包
真正卡住并发的往往不是 ThinkPHP 代码本身,而是 FPM 进程排队、OPcache 文件校验、Redis 连接池未复用、或是 Nginx 与 FPM 间 socket 权限错配——这些地方一漏,压测 QPS 就断崖掉一半。



















