要稳定支撑1万并发需六层协同调优:PHP/FPM(开启OPcache、static模式、realpath缓存、关闭日志磁盘IO)、框架(关闭DEBUG、预编译路由、mock副作用操作)、数据库(禁读写分离、PDO持久连接、连接池)、缓存(Redis替代file、预热热点数据)、队列(异步耗时任务)、压测隔离(HTTP头标识+影子库)。

ThinkPHP6 要稳定支撑 1 万并发压测,不能只改一两个配置,得从 PHP 环境、框架层、数据库、缓存、队列和压测工具六个层面协同调优。单点优化效果有限,链路中任一环节卡住(比如 OPcache 关着、日志写磁盘、MySQL 连接池打满),QPS 就会断崖下跌。
PHP 与 FPM 层硬性配置
这是吞吐量的底层地基,不调好,后续所有优化都白搭:
- php.ini 必须开启 OPcache:opcache.enable=1、opcache.memory_consumption=256、opcache.max_accelerated_files=65536;关键要关掉校验——opcache.validate_timestamps=0 和 opcache.revalidate_freq=0,否则每次请求都 stat 文件,I/O 直接拉垮
- FPM 建议用 static 模式:pm = static,pm.max_children 设为服务器内存可承载的最大常驻进程数(例如 8GB 内存、单进程均占 45MB,可设为 128);禁用 process_idle_timeout,避免高并发下误杀空闲进程
- 启用 realpath_cache:realpath_cache_size=4096K、realpath_cache_ttl=600,减少文件路径解析开销
- 日志输出切到 Stdout 或直接关闭:log.type = stdout 或 log.level = 'off',彻底规避磁盘 IO 瓶颈
ThinkPHP6 框架自身精简
框架默认行为在高压下全是累赘,必须做减法:
- 强制关闭调试:.env 中 APP_DEBUG = false;config/app.php 中 'debug' => false、'trace' => false —— 开着 debug 会让 TP 扫描模板、加载调试类、记录全量日志,响应时间翻 3 倍以上
- 预编译路由:执行 php think optimize:route,避免每次请求都解析路由规则
- 禁用副作用操作:支付、发短信、发邮件、调第三方 Webhook 全部 mock;数据库连接指向影子库(如 database_test),不能复用生产库名或前缀
- HTTP 请求头加压测标识:如 X-Test-Mode: full,配合中间件识别并隔离流量,防止污染线上数据
数据库与连接池调优
1 万并发下,MySQL 默认 151 连接数根本不够,连接等待会成为最大瓶颈:
立即学习“PHP免费学习笔记(深入)”;
- 禁用读写分离压测期间:config/database.php 中 'deploy' => 0,强制所有请求走主库,避免从库延迟导致数据不一致或查询失败
- 开启 PDO 持久连接:'params' => [PDO::ATTR_PERSISTENT => true],复用连接而非每次新建
- 若用 Swoole,配置连接池:'pool_size' => 200、'pool_get_timeout' => 5,缓解连接争抢
- MySQL 侧调大 max_connections 至 2000+,并确认内核参数 net.core.somaxconn 和 fs.file-max 匹配并发规模
缓存与异步解耦
把同步阻塞操作转成异步,是扛住高并发的关键策略:
- 缓存驱动换 Redis:cache.type = redis,避免 file 驱动在高并发下的文件锁争用;热点数据用 Cache::remember() 预热,减少穿透
- 耗时任务全进队列:发短信、写日志归档、生成报表等,用 Queue::push(new XxxJob($data)) 投递;Redis 作队列后端轻量高效,RabbitMQ 用于强一致性场景
- 消费者常驻运行:php think queue:listen --queue=default,必要时结合 Swoole 协程提升吞吐



















