tp8数据库连接池配置需显式启用、嵌套结构、参数完整且必须调用db::connect();tp6扁平配置已废弃,缺deploy/pooling/params任一字段或误用db::table()将导致连接池失效、查询静默失败或mysql连接中断。

TP6 和 TP8 在数据库连接池配置上不是“微调”,而是底层模型和写法逻辑的根本性切换——TP8 强制要求连接池显式启用、结构嵌套化、参数完整化,否则连接复用率骤降,甚至查询静默失败。
配置结构:从扁平到嵌套,必须收进 connections
TP6 的 database.php 支持顶层直写 host/database/username 等字段,连接池配置可选填;TP8 彻底废弃该结构:
- 删掉所有顶层键如 hostname、database、username,它们在 TP8 中完全无效
- 全部驱动配置必须包裹在 connections => ['default' => [...]] 内
- 多库场景(如日志库、统计库)需定义多个子键:'log'、'stat',并在代码中显式传参调用
必填字段:deploy、pooling、params 缺一不可
TP8 连接池不是“开了就行”,三个键必须显式声明且值合法:
- deploy => 1:启用读写分离识别,不设则主从路由失效
- pooling => true:开启连接池,false 或缺失将退化为临时连接,千级并发下连接创建耗时占比超 60%
- params => []:必须存在空数组,缺了会导致 PDO 构造报错:PDO::__construct(): Argument #4
调用方式:必须显式 connect(),Db::table() 不再自动复用
TP6 中 Db::name('user') 或 Db::table('user') 可隐式复用单例连接;TP8 完全切断该路径:
- 所有查询必须写成 Db::connect('default')->table('user')->where(...)->find()
- 继续用 Db::table() 会 fallback 到无池化的临时连接,连接池命中率低于 40%
- Db::connect() 返回协程安全连接对象,Swoole 环境下才真正复用,FPM 下无池化优势
服务端配合:MySQL 参数必须同步调优
TP8 连接池依赖 MySQL 服务端协同,否则空闲连接被主动断开,引发 MySQL server has gone away:
- 确认 wait_timeout ≥ 连接池 lifetime(默认 3600),否则 PHP 层还认为连接活跃,MySQL 却已关闭
- my.cnf 中建议设置:max_connections = 300、wait_timeout = 300、interactive_timeout = 300
- 执行 SHOW VARIABLES LIKE 'wait_timeout' 验证是否生效,若仍为 28800,说明配置未加载,需重启 MySQL











