thinkphp 6 读写分离需严格配置:default仅指连接名,connections下定义完整参数;必须同时满足deploy=1、rw_separate=true、write和read结构正确、字符集与库名完全一致四条件,否则查询静默回退主库。

ThinkPHP 6 的读写分离不是“配了 read 就自动走从库”,必须在 config/database.php 中严格按层级、键名、数组结构写对,缺一不可——否则所有查询静默回退主库,还不报错。
default 和 connections 必须分工明确
框架只认 default 指向的连接名(比如 'mysql'),而该连接的实际配置必须完整定义在 connections['mysql'] 里。不能把数据库参数直接写在 default 下,也不能用临时数组调用 Db::connect([])。
-
default只能是字符串,如'mysql'或'main_db' -
connections下的每个键名必须是合法 PHP 变量名:小写字母开头、仅含字母/数字/下划线,不能有.、-或大写字母 - 每个连接配置必须包含
type、hostname、database、username、password、charset六项,漏掉type会导致驱动误判
启用分离的四个硬性条件
只有同时满足以下四点,Db::name('user')->select() 才可能走从库:
-
'deploy' => 1:总开关,没有它整个机制不初始化 -
'rw_separate' => true:仅当deploy === 1时生效 -
'write'是一维关联数组,含完整主库参数,例如:['hostname' => '192.168.1.5', 'username' => 'rw_user', 'database' => 'app_db'] -
'read'是二维数组,哪怕只有一个从库也要套一层:例如[ ['hostname' => '192.168.1.10', 'username' => 'ro_user', 'database' => 'app_db'] ]
字符集与 database 名必须完全一致
主库和所有从库的 charset(如 'utf8mb4')和 database 名必须严格相同。若从库用 utf8 而主库用 utf8mb4,emoji 字段会乱码或写入失败;若 database 名不同,跨库 JOIN 或事务将出错。
- 建议显式声明
'charset' => 'utf8mb4',不要依赖默认值 - 所有节点使用同一库名,避免因命名差异导致路由异常
手动指定读连接的两种可靠方式
当需要绕过自动路由(如报表查专用从库),或调试时确认某条 SQL 是否真走从库,可用以下方法:
- 在
connections中单独定义只读连接,如'report_slave',不含deploy或rw_separate - 代码中用
Db::connect('report_slave')->table('log')->select(),该连接完全独立,不参与读写分离逻辑 - 对普通构造器链式调用
->useReadConnection(),例如:Db::table('user')->useReadConnection()->where('id', 1)->find()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











