ThinkPHP无内置数据库连接池,FPM下仅'deploy'=>1有效实现PDO复用,Swoole协程下需Db::pool()显式调用且配置在config/swoole.php中,CLI模式需手动管理生命周期。

ThinkPHP 本身不内置数据库连接池,所谓“连接池参数调优”,本质是根据运行环境选择并正确启用对应的复用机制——FPM 下靠 deploy => 1 实现单进程内 PDO 实例复用;真连接池只在 Swoole 协程环境下生效,且必须通过 Db::pool() 显式调用才起作用。
确认运行模式再配参数
配置前先明确当前部署方式:
- FPM 模式:所有
pool、max_connections等字段在config/database.php中完全无效;唯一有效的是'deploy' => 1,它让相同数据库配置共享一个 PDO 实例 - Swoole 协程模式(需
topthink/think-swoole >= 3.1.0+swoole >= 4.8.0):连接池配置必须写在config/swoole.php的database节点下,且'enable' => true不可省略 - CLI 模式(如队列、定时任务):可配合
auto_close => false和手动归还逻辑使用池,但需自行管理生命周期
关键参数含义与推荐值
config/swoole.php 中的 database 配置段决定协程连接池行为:
-
min_connections:Worker 启动时预创建的连接数。建议设为 5–10,避免首请求延迟;过高会提前占满 MySQL 连接数 -
max_connections:池中最多维持的总连接数(空闲+忙碌)。应 ≤ MySQL 的max_connections值(默认 151),建议设为 30–80,视服务器内存和并发量调整 -
wait_timeout:协程等待空闲连接的超时时间(单位:秒)。设太小(如 0.5)易抛ConnectionPoolTimeoutException;推荐 2–5 秒 -
heartbeat:心跳检测间隔(秒)。设为 30 可及时清理失效连接,避免MySQL has gone away
代码层必须显式走池入口
配了参数但没效果?大概率是代码仍走默认短连接:
立即学习“PHP免费学习笔记(深入)”;
- ❌
Db::table('user')->select()→ 每次新建 PDO 连接 - ✅
Db::pool()->table('user')->select()→ 从池取连接,用完自动归还 - 事务必须写成
Db::pool()->transaction(function () { ... }) - 模型类不自动继承池行为,需在模型中重写
db()方法:protected function db() { return Db::pool(); }
配套服务端调优不能少
连接池效果受 MySQL 侧限制直接影响:
- 检查并调大 MySQL 的
max_connections(例如设为 500),否则池里配置再高也连不上 - 把
wait_timeout和interactive_timeout从默认 28800(8 小时)适当降低至 300–600 秒,减少僵尸连接堆积 - 确保 PHP 进程或 Swoole Worker 数(
worker_num)与池容量匹配,避免“有池无工” - 监控可用连接:可在控制器中打印
Db::getPool()->stats()查看当前活跃/空闲连接数



















