thinkphp配置加载优先级为.env环境变量>运行时动态设置>php配置文件>框架默认值,.env中db_host等键会覆盖config/database.php对应项,且修改后需清除runtime/config.php缓存才生效。

ThinkPHP 的配置不是“写完就跑”,而是有明确优先级和加载路径的系统行为。直接改 config/database.php 却发现数据库连不上?大概率是 .env 里同名键覆盖了它,或者 runtime/config.php 缓存没清。
为什么改了 config/database.php 还不生效
ThinkPHP 配置加载有固定顺序:环境变量(.env) > 动态设置(代码中 config() 调用) > PHP 配置文件(config/*.php) > 框架默认值。这意味着:
-
.env中只要定义了DB_HOST、DB_NAME等键,就会完全覆盖config/database.php里对应的'hostname'或'database' -
.env的键名是扁平的,比如DB_HOST=127.0.0.1,不是嵌套格式database.hostname=... - 改完
.env后必须清空runtime/cache/和runtime/config.php,否则旧缓存会继续生效 - 确认
.env文件在项目根目录,且未被gitignore忽略导致上线后丢失
database.php 里主从配置总走主库的三个硬条件
启用读写分离不是加个 read 数组就行,TP6/TP8 要求同时满足:
-
'deploy' => 1必须写在具体连接配置内部,例如'connections.mysql.deploy' => 1,不能放在'default'顶层 -
'rw_separate' => true必须与deploy同级,二者是绑定关系 -
'read'必须是数组套数组(支持多个从库),'write'必须是单层数组(只允许一个主库);写成'write' => [['hostname' => 'master']]会直接抛出Invalid write database config
典型安全写法:
'connections' => [
'mysql' => [
'deploy' => 1,
'rw_separate' => true,
'read' => [
['hostname' => 'slave1', 'username' => 'ro', 'password' => 'xxx'],
['hostname' => 'slave2', 'username' => 'ro', 'password' => 'xxx']
],
'write' => ['hostname' => 'master', 'username' => 'rw', 'password' => 'xxx'],
// 其他字段如 type/database/charset 等仍需补全
]
]
多应用模式下子应用配置不加载的常见原因
开启 app_multi => true 后,app/admin/config/app.php 这类子应用配置默认不会自动合并进全局配置。关键点在于:
- 子应用的配置文件只有在该应用被路由命中时才会加载,全局
config/app.php不会预加载它们 - 子应用内要用
config('app.debug')读取的是自己目录下的app/config/app.php,不是根目录的 - 如果想让某个配置对所有子应用生效,必须写在根目录
config/下(如config/cache.php),或通过env()注入 -
app_namespace必须与实际目录结构一致,比如子应用在app/api,则app_namespace应设为'app',控制器命名空间才可能是app\api\controller\Index
配置缓存生成后修改无效怎么办
运行 php think optimize:config 生成的 runtime/config.php 是“最终合并结果”,它把所有来源(.env + 所有 config/*.php)一次性拍平成 PHP 数组。这意味着:
- 此后任何对原始 PHP 配置文件或
.env的修改,都不会自动反映到这个缓存文件里 - 生产环境启用缓存后,每次部署新配置,必须重新执行该命令,或手动删掉
runtime/config.php - 开发阶段建议关闭配置缓存(注释掉
APP_CONFIG_CACHE或不运行该命令),避免反复清缓存 -
config()助手函数读取的就是这个缓存后的结果,不是实时解析文件
最易被忽略的一点:runtime/config.php 是 PHP 文件,但它的内容由框架生成,**不要手动编辑它**——下次运行 optimize:config 会被完全覆盖。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











