要让ThinkPHP6稳定支撑1万并发,关键在于FPM选static模式、精算pm.max_children,关闭OPcache时间验证,启用file_cache,缓存分层用Swoole Table+Redis,Nginx改Unix socket并调优内核参数。

要让 ThinkPHP6 稳定支撑 1 万并发,关键不在框架本身,而在于 PHP-FPM 进程池能否持续、低抖动地调度这 10,000 个并发请求。这不是简单调大 pm.max_children 就能解决的——它必须与内存实测值、OPcache 行为、Redis 缓存分层、Nginx 协同及系统内核参数形成闭环。下面给出可落地的完整调优路径。
一、FPM 进程模式与核心参数:选 static + 精算 max_children
1 万并发下,必须用 pm = static。dynamic 模式在持续高压下会因频繁 fork/spawn 导致 CPU 抖动加剧、响应延迟不可控,且空闲进程回收逻辑(如 pm.process_idle_timeout)反而引发连接中断。
计算 pm.max_children 的唯一可靠方式是实测单进程 RSS:
- 压测 ThinkPHP6 应用 30 分钟以上,运行
ps aux --sort=-%mem | grep 'php-fpm:' | head -5,取 RSS 稳定值(例如 98MB) - 查看可用内存:
free -m中的 available 值(非 total),减去 OS(留 2GB)、MySQL(实测 RSS)、Redis(约 300–500MB)、Nginx(约 200MB) - 假设可用内存为 12GB,单进程 RSS 为 98MB → 12000 ÷ 98 ≈ 122 → 设为 110(留 10% 冗余)
静态模式下,其他动态参数(pm.start_servers、pm.min_spare_servers 等)全部失效,无需配置。禁用 pm.process_idle_timeout(仅 dynamic 有效,但常被误配)。
立即学习“PHP免费学习笔记(深入)”;
二、OPcache 必须关闭时间验证,启用文件缓存
ThinkPHP6 的路由编译、模板缓存、类自动加载高度依赖 OPcache。默认开启的 opcache.validate_timestamps = 1 会让每个请求都执行 stat() 检查文件修改时间——在 1 万并发下,这会瞬间打爆 ext4 inode cache 或触发大量磁盘 I/O 等待,成为首个性能断点。
生产环境 OPcache 关键配置:
opcache.validate_timestamps = 0-
opcache.revalidate_freq = 0(即使 validate_timestamps=0,该值也需显式设为 0) -
opcache.max_accelerated_files = 65536(ThinkPHP6+ 多模块+多模板极易突破默认 2000) -
opcache.file_cache = /tmp/opcache(FPM 重启后秒级热加载,避免冷启抖动) - 上线后通过
opcache_reset()或kill -USR2 $(cat /var/run/php/php8.1-fpm.pid)手动刷新缓存
三、ThinkPHP6 缓存策略:Swoole Table + Redis 分层
默认 cache.type = file 在 1 万并发下会产生海量小文件锁争用(flock),直接拖垮 I/O;全走 Redis 则单实例易成瓶颈(尤其 config、route、lang 等元数据高频读)。
推荐分层方案:
- 核心元数据(路由表、配置项、语言包)→ Swoole Table:内存级、无网络开销、支持高并发读写,配合 Swoole HTTP Server 或 Worker 进程常驻
-
业务缓存(用户会话、商品详情、列表页)→ Redis 集群:使用连接池(如
'pool_size' => 200),避免连接创建耗时 - 禁用
session_start()默认文件驱动;改用 Redis 存储 session,并设置session.gc_maxlifetime合理值(如 7200)
四、配套系统与 Nginx 调优:打通最后一环
FPM 池只是链条一环,Nginx 和内核必须同步优化:
- Nginx 使用 Unix socket(
listen unix:/run/php/php8.1-fpm.sock),而非 TCP,减少网络栈开销 -
worker_processes auto;,worker_connections 65535;,multi_accept on; - 内核参数调优:
net.core.somaxconn = 65535,net.ipv4.tcp_max_syn_backlog = 65535,fs.file-max = 2097152 - PHP-FPM 池配置中启用
pm.status_path = /fpm-status,配合 Nginx 反向代理监控实时负载(如活跃进程数、请求数/秒) - 关闭 ThinkPHP6 调试:
APP_DEBUG = false;预编译路由:php think optimize:route
不复杂但容易忽略



















