ThinkPHP 6.0 需通过 think-swoole 扩展在 Swoole 协程环境下实现数据库连接池,FPM/CLI 模式下无效;必须使用 php think swoole 启动,并显式调用 Db::pool() 才生效。

ThinkPHP 6.0 本身不原生支持数据库连接池,必须依赖 think-swoole 扩展,在 Swoole 协程环境下才能实现真正的连接复用。单纯改 database.php 或开启 PDO 持久化,无法解决高并发下的 Too many connections 问题。
确认运行环境是否达标
连接池只在 Swoole 协程服务器中生效,FPM/CLI 模式下所有配置均无效:
- 执行
php -r "echo SWOOLE_VERSION;",确保输出 ≥ 4.8.0(推荐 5.1+) - 运行
php -m | grep swoole,确认扩展已加载 - 项目中安装
topthink/think-swoole:运行composer require topthink/think-swoole - 发布配置:执行
php think swoole:publish,生成config/swoole.php - 启动服务必须用
php think swoole,不能走 php-fpm 或内置服务器
正确配置连接池参数
所有有效配置都在 config/swoole.php 的 database 节点下,database.php 中的 pool_size 等字段会被完全忽略:
-
'enable' => true:必须是布尔值 true,写成字符串或数字会静默失效 -
'min_connections' => 5:Worker 启动时预创建的空闲连接数,设为 0 会导致首请求明显延迟 -
'max_connections' => 30:单 Worker 内最大活跃连接总数(含空闲+忙碌),不是 MySQL 全局上限 -
'wait_timeout' => 3.0:协程等待空闲连接的超时秒数,太小易抛异常,太大易阻塞
示例配置片段:
立即学习“PHP免费学习笔记(深入)”;
'database' => [
'enable' => true,
'min_connections' => 5,
'max_connections' => 30,
'wait_timeout' => 3.0,
]
代码中必须显式调用池化入口
连接池不是全局拦截器,不调用就不起作用。以下写法才真正走池子:
- ✅
Db::pool()->table('user')->select() - ✅
Db::pool()->transaction(function () { ... }) - ✅
$pdo = Db::pool()->getPdo()(可用于验证复用) - ❌
Db::table('user')->select()(仍走短连接) - ❌
Db::connect('mysql2')->table(...)(绕过池子) - ❌ 模型类中
self::where(...)->find()(默认不走池,需手动代理)
验证是否复用成功:连续两次调用 Db::pool()->getPdo(),打印 spl_object_id(),ID 相同说明复用生效。
常见误区与避坑提醒
这些操作看似相关,实则与连接池无关:
-
deploy => 1是 TP6 的 PDO 实例缓存开关,适用于 FPM 和 Swoole,但不是连接池 - PDO 持久连接(
PDO::ATTR_PERSISTENT => true)仅在 PHP-FPM 进程复用场景下有效,协程中不适用 - 多数据库配置(如
connections['mysql2'])本身不启用池,要走池必须配合Db::pool()->connect('mysql2') - 模型类的
$connection属性绑定的是连接配置名,不自动接入池;如需池化,需重写db()方法返回Db::pool()->connect(...)



















