ThinkPHP数据库配置采用多级机制,优先级从高到低为.env或database.php、app/config.php、框架内置convention.php;核心项需用小驼峰命名如'hostname'而非DB_HOST,且修改后须清缓存才生效。

配置文件位置与加载优先级
ThinkPHP5+ 默认不提供单一 config.php,而是采用多级配置机制:
-
基础配置:框架内置
thinkphp/convention.php,不可直接修改 -
应用配置:
app/config.php,用于覆盖基础项,如数据库连接参数 -
环境配置:
app/database.php(推荐单独拆分),或通过.env文件管理敏感信息(TP6 支持,TP5 需扩展) -
动态配置:运行时调用
Config::set('database', [...]),仅对当前请求有效
注意:后加载的配置会覆盖前一级,database.php 比 config.php 中同名键优先级更高。
核心数据库配置项及写法规范
必须掌握的键名不是“DB_HOST”这类旧版写法,而是 ThinkPHP5+ 的标准数组结构:
-
'type' => 'mysql'—— 驱动类型,支持 pdo、sqlite 等 -
'hostname' => '127.0.0.1'—— 不用DB_HOST,注意字段名小驼峰 -
'database' => 'shop_db'—— 对应旧版DB_NAME -
'username' => 'root'、'password' => '123456' -
'hostport' => 3306—— 注意是hostport,不是port或DB_PORT -
'prefix' => 'tp_'—— 表前缀,末尾不加下划线更安全(避免双下划线冲突) -
'debug' => true—— 开启调试可查看生成的 SQL,但线上必须为 false
配置生效时机与典型错误
数据库配置在应用初始化阶段加载,但实际连接延迟到第一次查询时才建立。容易踩坑的地方有:
立即学习“PHP免费学习笔记(深入)”;
- 把数据库密码写在
config.php中并提交 Git —— 正确做法是用.env或服务器环境变量注入 - 误以为改了配置立刻生效 —— 修改后需清空
runtime/cache/目录,否则缓存配置仍被使用 - 多数据库场景下未正确切换 —— 使用
Db::connect('slave')前,必须先在配置中定义'slave'连接组 - 本地测试连得上,线上报错 “Access denied” —— 很可能是
hostname写成localhost,而容器或云数据库要求用内网 IP 或域名
如何验证配置是否正确
不靠猜,用代码验证最可靠:
- 在控制器中执行
dump(\think\facade\Db::getConfig());查看最终合并后的配置数组 - 运行
php think optimize:config(TP5.1+)检查配置语法是否合法 - 手动触发一次查询:
\think\facade\Db::table('user')->find();,观察是否抛出连接异常 - 开启 SQL 日志:
'log' => ['level' => ['sql']],在runtime/log/下确认日志生成
配置本身不复杂,但组合环境、权限、缓存后容易出问题。面试时能讲清加载流程和验证手段,比背出十行配置更有说服力。



















