ThinkPHP6 稳定支撑 1 万并发需强制启用数据库连接池、改用 Redis Session 和缓存、异步化非核心操作;禁用文件驱动、显式调用 Db::pool()、规范缓存 Key 并预热、事务内避免外部调用。

ThinkPHP6 要稳定扛住 1 万并发,单靠框架默认配置根本不行。核心瓶颈在数据库——连接耗尽、查询阻塞、缓存错用这三块最容易崩。实操必须围绕“减连接数、降查询频、避文件锁”来展开,不是堆配置,而是改写法。
强制启用数据库连接池(关键一步)
TP6 原生不带连接池,必须通过 topthink/think-swoole 扩展 + Swoole Worker 模式启用。FPM 下所有 pool 配置都无效。
- 确认已安装
swoole >= 4.8.0和topthink/think-swoole >= 3.1.0 - 在
config/swoole.php中配置连接池参数:'db_pool' => [ 'max_active' => 20, 'max_idle' => 5, 'wait_timeout' => 1500 ] - 代码中必须显式调用
Db::pool(),否则仍走短连接:Db::pool()->table('user')->where('id', 1)->find(); - 模型类默认不走池子,需重写
db()方法或在查询时手动套用
关闭调试+禁用 Session 文件锁
生产环境开启 APP_DEBUG = false 是底线。但更隐蔽的坑是 Session 文件驱动——高并发下所有请求会排队等同一个 session 文件解锁。
- 在
.env中确保:APP_DEBUG=false,SESSION_TYPE=redis(不能用 file) - 若必须用 Session,Redis 驱动配置要加
'use_redis' => true,避免本地文件锁 - 检查中间件或控制器里是否误调
session_start(),删掉或替换成无锁方式
缓存必须切到 Redis 并规范 Key 管理
TP6 默认缓存驱动是 file,1 万个请求同时读写一个 cache 文件,直接卡死。切 Redis 只是第一步,Key 设计和过期策略才是重点。
- 在
config/cache.php中设'default' => 'redis',并配好 host/port - 禁止用模糊 Key 或不设过期时间:
Cache::set('user_'.$id, $data, 3600);(带业务前缀+明确 TTL) - 高频数据用
Cache::remember()自动回源,避免穿透;热点数据用定时任务预热 - 禁用
Cache::get()直接查文件驱动,所有缓存操作必须走 store 显式指定
异步化非核心 DB 操作
日志记录、用户行为埋点、消息通知这类操作,绝不允许同步连库。1 万并发下哪怕每次只多花 20ms,整体响应就拖垮。
- 用
topthink/think-queue接 Redis 队列,把 insert 日志、发短信等逻辑投递进队列 - 消费者进程独立运行,不共享 Web 请求的数据库连接
- 事务内只做必要 DB 操作,
Db::transaction()里避免调外部接口或 sleep - 批量插入优先用原生 SQL 拼接,比
insertAll()更少内存占用、更快
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











