php-fpm 运行 thinkphp 需四方面协同:①用 static 模式并设合理 pm.max_children;②opcache 关闭时间验证、增大文件数、启用 file_cache;③缓存切 redis、高频读用 swoole table;④数据库启用 think-swoole 连接池。

要让 PHP-FPM 稳定高效运行 ThinkPHP(尤其 TP6/TP8),不能只改几个参数,得从进程模型、内存分配、缓存行为和连接管理四方面协同配置。下面直接说关键动作,不绕弯。
PHP-FPM 必须用 static 模式
dynamic 或 ondemand 在万级并发下会频繁 fork/spawn 子进程,导致 CPU 抖动、响应延迟跳变,实测平均多耗 120ms+。static 模式固定进程数,调度更稳、更可预测。
- 配置
pm = static - 删除或注释掉
pm.start_servers、pm.min_spare_servers、pm.max_spare_servers(这些在 static 下无效) - 显式设
pm.process_idle_timeout = 0或直接注释(防误配)
pm.max_children 要按实测 RSS 算,不是拍脑袋
每个 php-fpm 进程真实内存占用(RSS)必须压测后看:
- 启动服务,持续压测 30 分钟以上
- 执行
ps aux --sort=-%mem | grep 'php-fpm:' | head -5,取 RSS 稳定值(如 98MB) - 可用内存 = 总内存 − OS(留 2GB)− MySQL(查
ps aux | grep mysqlRSS)− Redis(同机约 300–500MB)− Nginx(约 200MB) - 例如:64GB 服务器,可用约 44GB,单进程 98MB →
44 × 1024 ÷ 98 ≈ 462→ 设为450(留 3% 冗余)
OPcache 关闭时间验证,否则 I/O 直接打爆
ThinkPHP 的路由编译、模板缓存、类自动加载全靠 OPcache,但默认 opcache.validate_timestamps = 1 会让每个请求都 stat 所有 PHP 文件——万并发下瞬间冲垮 inode cache 或触发大量磁盘等待。
-
opcache.validate_timestamps = 0 -
opcache.revalidate_freq = 0(即使上一项为 0,也必须显式设) -
opcache.max_accelerated_files = 65536(TP6+ 多模块易超默认 2000) -
opcache.file_cache = /tmp/opcache(FPM 重启后秒级热加载,避免冷启抖动) - 上线更新后,调
opcache_reset()或kill -USR2 $(cat /var/run/php/php-fpm.pid)
缓存与数据库连接必须绕过文件锁和短连瓶颈
-
cache.type = file在高并发下产生海量小文件 flock 冲突,必须切到Redis;高频本地读(如开关、计数)用Swoole Table - 默认
Db::table()是短连接,1 万并发可能瞬间打爆 MySQL 的max_connections(默认 151)。只有启用topthink/think-swoole扩展 + Swoole 连接池才有效:- 安装 Swoole ≥ 4.8.0 和
think-swoole - 在
config/swoole.php中配'db_pool' => ['max_active' => 200, 'max_idle' => 10, 'wait_timeout' => 3000] - 代码中显式走池子:
Db::connect('pool')
- 安装 Swoole ≥ 4.8.0 和
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











