thinkphp数据库配置需严格遵循扁平化+connections双层结构,default必须匹配connections中键名,每个连接须含type、hostname、database、username、password、charset六项,敏感信息须从.env读取并清缓存,多库切换需预定义连接且读写分离需手动启用。

ThinkPHP 的数据库配置不是“填完账号密码就能跑”,关键在结构对、字段全、环境稳。配错一个键名或漏掉 type,轻则连不上,重则报 Class 'PDO' not found 或中文乱码。下面直接讲清楚怎么配、为什么这么配、哪里最容易踩坑。
database.php 的核心结构必须写对
ThinkPHP 6+ 的数据库配置是扁平化 + connections 嵌套双层结构,只有这几个顶层键名真正生效:
-
default:字符串,必须等于 connections 里某个连接的键名(比如
'user'),不能写'mysql'或留空 -
connections:关联数组,每个子项是一个完整独立的数据库连接,键名将用于后续
Db::connect('log_db') - deploy、debug、fetch_sql 等开关类配置,只在顶层写才全局生效;若误塞进某个 connection 里,会被完全忽略
每个连接必须包含六项基础参数
无论你用的是 MySQL、PostgreSQL 还是达梦,只要定义在 connections 里,以下六项缺一不可,否则连接初始化失败:
-
type:驱动类型,如
'mysql'、'pgsql'、'dm'(达梦)——漏写会回退默认驱动,导致兼容错误 - hostname:数据库服务器地址,支持 IP 或域名
- database:目标库名,该库需已存在且权限正确
- username 和 password:账号密码,严禁硬编码
-
charset:建议统一用
'utf8mb4',主从/多库间不一致会导致 emoji 写入失败或显示为问号
其他如 hostport、prefix、params 属于增强项,但 params 是唯一能透传 PDO 底层参数的地方(例如 SSL 证书路径、超时设置)。
敏感信息必须从 .env 读取
把密码写死在 database.php 里等于公开数据库权限。正确做法是:
- .env 文件放在项目根目录,变量全大写+下划线,如:
DATABASE_HOST=192.168.1.10、DATABASE_PASSWORD=secr3t! - 在
database.php中显式调用env(),例如:'hostname' => env('DATABASE_HOST', '127.0.0.1') - 修改 .env 后必须执行
php think clear:config清除配置缓存,否则旧值仍生效
注意:env() 第二个参数只是本地开发 fallback,默认值不能用于生产环境。
多库切换与读写分离实操要点
想让业务走主库、日志查从库、报表连另一套集群?必须分三步走:
-
先预定义所有连接:在
connections里把'user_db'、'log_db'、'report_db'全部配齐,键名不能含点号或大写字母('log.db'会抛 Connection not found) -
读写分离要手动触发:TP6 不自动识别 SQL 类型。启用需同时满足:
'deploy' => 1(总开关)、'rw_separate' => true、'write'为一维数组、'read'为二维数组;且所有库charset必须一致 -
查询时显式指定:
Db::connect('log_db')->name('sys_log')->select()或链式调用->useReadConnection(),否则默认走default连接
事务中所有操作强制走主库,无需额外处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











