ThinkPHP6官方不支持数据库连接池,database.php中无pool等配置项;其连接管理基于请求生命周期,仅在Swoole协程模式下通过think-swoole v4+的config/swoole.php中db_pool配置启用连接池。

ThinkPHP6里没有内置数据库连接池
直接说结论:ThinkPHP6 官方不支持数据库连接池,database.php 配置中也找不到 pool、maxActive 或类似字段。这和部分用户从 TP5.1/5.2 升级后预期不符——TP5 也没原生连接池,但社区有基于 Swoole 的扩展方案(如 topthink/think-swoole),而 TP6 默认运行在 PHP-FPM 下,每次请求都是新进程,根本用不上传统意义的“连接池”。
常见错误现象:Call to undefined method think\db\Connection::setPool() 或配置里加了 'pool' => [...] 却完全不生效;本质是误把 Swoole 扩展能力当成了框架内置功能。
- TP6 的数据库连接管理是按请求生命周期来的,连接在
Db::close()或脚本结束时自动释放 - 若你真在用 Swoole + TP6(比如通过
topthink/think-swoole),连接池才可能启用,但需单独安装并配置swoole相关参数 - 注意
think-swoolev4+ 对应 TP6,其连接池配置不在database.php,而在config/swoole.php中的'db_pool'项
想复用连接?重点看 PDO 长连接配置
很多用户所谓“连接池需求”,实际只是想避免频繁创建 MySQL 连接开销。TP6 支持 PDO 层面的长连接,靠的是底层 PDO::ATTR_PERSISTENT,但必须手动开启,且有明显副作用。
使用场景:高并发短请求(如 API 接口)、MySQL 服务器允许复用连接、应用无状态且不依赖连接级变量(如 SET @var)。
立即学习“PHP免费学习笔记(深入)”;
- 在
config/database.php的数据库配置里添加:'params' => [PDO::ATTR_PERSISTENT => true] - 不要在事务中混用长连接——事务未提交时连接被复用会导致
MySQL has gone away - 长连接会延迟释放,可能导致 MySQL
max_connections被耗尽,需配合监控SHOW STATUS LIKE 'Threads_connected' - TP6 默认关闭长连接,因为 FPM 模式下连接复用收益有限,反而增加维护成本
升级时遇到 TP5 的 pool 配置报错
如果你从 TP5 迁移,发现 config 文件里留着 'pool' => ['maxActive' => 20] 这类配置,TP6 启动或查询时不会报错,但该配置会被完全忽略——框架压根不读它。
错误现象:日志里没报错,但连接数始终居高不下、慢查询增多,误以为“池没生效”,其实是根本没走池逻辑。
- 删掉
database.php中所有'pool'相关键值对,包括'time_out'、'wait_timeout'等非标准字段 - 检查是否引入了旧版
think-swoole(v3.x),它和 TP6 不兼容,会引发Class 'Swoole\Http\Server' not found等问题 - 若确需连接复用,请明确技术栈:是坚持 FPM 就优化 PDO 长连接 + MySQL 连接超时;要真正连接池,就得上 Swoole 并用
think-swoolev4+,且接受协程编程约束
Swoole 场景下如何配 db_pool
只有当你用 think-swoole v4 启动协程服务时,db_pool 才有意义。此时连接池由 Swoole 协程调度器管理,和 TP6 的 Db 类解耦。
配置位置不是 database.php,而是 config/swoole.php:
'db_pool' => [
'enable' => true,
'max_active' => 30,
'min_idle' => 5,
'max_wait_time' => 3,
],
性能影响很直接:开启后单个 Worker 可复用连接,QPS 提升明显,但要注意 max_active 值不能超过 MySQL 的 max_connections,否则会卡在等待连接。
- 必须确保
think-swoole版本 ≥ 4.0.0,且启动命令为php think swoole - 协程内不能混用同步 MySQL 扩展(如 mysqli),只能用
think-swoole封装的协程 DB 类 -
Db::connect()在协程模式下返回的是池化连接,但调用close()不会真正断开,只是归还到池



















