thinkphp 6 原生不支持连接池,db::connect() 在 fpm 下恒为短连接,pool_size 配置在纯 tp6 中无效;连接池仅由 think-swoole 在 swoole 协程环境下实现,需启用 php think swoole 启动并配置 config/swoole.php 中的 database.enable = true。

ThinkPHP 6 原生不支持连接池,必须用 think-swoole
直接说结论:Db::connect() 在 FPM 下永远是短连接,pool_size 配置在纯 TP6 中完全无效。所谓“连接池”不是 TP 自带能力,而是 think-swoole 扩展在 Swoole 协程环境下实现的连接复用机制。
常见错误现象:SQLSTATE[HY000] [2002] Connection refused 或压测时大量 Too many connections,90% 是因为误以为 TP6 原生支持池,结果连 Swoole 都没装、协程根本没启用。
- 必须先安装扩展:
composer require topthink/think-swoole - 确认 Swoole 版本 ≥ 4.8.0(推荐 5.1+),且 PHP 启用了
swoole扩展 - 运行方式必须是
php think swoole,不能走php-fpm或php -S -
config/database.php里写的pool_size字段会被忽略,只在config/swoole.php生效
think-swoole 的 database 配置位置和关键字段
连接池开关和参数不在 database.php,而在 config/swoole.php 的 database 节点下。这个配置只有在 enable => true 时才会替换默认的 Db 实例为协程池代理。
示例最小有效配置:
return [
'database' => [
'enable' => true,
'min_connections'=> 5,
'max_connections'=> 50,
'wait_timeout' => 3.0,
'heartbeat' => 30,
],
];
-
enable必须为布尔true,设成"true"或1会静默失效 -
max_connections是池中最大活跃连接数,不是 MySQL 的max_connections—— 后者必须 ≥ 前者,否则启动就报错 -
wait_timeout是获取连接的等待超时(秒),设太小会导致协程直接抛Swoole\Coroutine\MySQL\Exception -
heartbeat是空闲连接心跳检测间隔(秒),防止被 MySQLwait_timeout主动断开
deploy => 1 和 pool_size 在 TP6 中完全不是一回事
很多人混淆这两个配置:deploy => 1 是 TP6 应用层的 PDO 实例缓存开关,而 pool_size(在 think-swoole 下)是协程连接池容量控制。两者作用域、生效条件、底层机制完全不同。
-
deploy => 1在 FPM 和 Swoole 下都起作用,但它只复用 PDO 对象,不解决连接建立耗时,也不防Too many connections -
pool_size(或 think-swoole 中的max_connections)只在协程中生效,它管理的是真实 TCP 连接,能真正避免重复握手 - TP 5.1 的
pool_size是个摆设;TP 6.1+ 的同名字段仅在 think-swoole 中解析,FPM 下读到也直接丢弃 - 验证是否生效:在协程中连续执行
Db::query('SELECT CONNECTION_ID()')5 次,返回的 ID 有重复才说明复用成功
高并发下容易被忽略的三个硬限制
连接池不是调大 max_connections 就万事大吉。实际压测时卡住,往往是因为没对齐三层限制:
- MySQL 层:
SHOW VARIABLES LIKE 'max_connections'—— 必须 ≥ think-swoole 的max_connections,否则新连接直接被拒 - PHP 层:Swoole 的
worker_num× 协程并发数,不能长期超过 MySQL 允许的连接上限 - 应用层:事务未提交、
Db::transaction()没配go()、查询后没及时释放结果集,都会让连接卡在“busy”状态不归还
最常被漏掉的是空闲连接回收:think-swoole 不自动清理长期空闲连接,必须靠 heartbeat + MySQL 的 wait_timeout 双重兜底。设了 max_connections => 100 却忘了调 MySQL 的 max_connections,等于在门口堆了 100 把钥匙,但锁芯只认 30 把。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











