php artisan config:cache 会将 config/database.php 中的 env() 调用替换为 .env 解析出的实际值(如 'default' => 'mysql'),固化到 bootstrap/cache/config.php,此后不再读取 .env;修改数据库配置必须重新运行该命令才能生效。

数据库配置本身不参与 config 缓存生成,但它的值(比如 DB_CONNECTION)会被缓存 —— 也就是说,config 缓存里存的是从 .env 解析出的最终字符串,不是数据库连接实例。
config:cache 会把 database.php 里的 env() 调用替换成实际值
你写在 config/database.php 里的这行:
'default' => env('DB_CONNECTION', 'mysql'),
执行 php artisan config:cache 后,bootstrap/cache/config.php 里对应位置会变成:
'default' => 'mysql',
—— 它不再调用 env(),也不再读 .env。所以:
- 修改
.env中的DB_CONNECTION,不重新运行config:cache就不会生效 - 如果
.env文件缺失或权限错误,只要 config 缓存存在,应用仍能启动(因为不依赖.env) - 但如果你在配置里写了闭包(比如
'prefix' => function() { return 'tbl_'; }),config:cache会直接报错:Your configuration files are not serializable
数据库连接驱动选择不受 config 缓存影响,但驱动参数受其固化
Laravel 真正建立数据库连接时,用的是 DB_CONNECTION 的值去查 config/database.php 里对应的连接配置块(如 connections.mysql)。这个查找过程发生在 config 缓存加载之后,所以:
-
config:cache不决定用 MySQL 还是 PostgreSQL,只决定「用哪个键去查」和「查到的参数是什么」 - 比如你把
DB_CONNECTION=pgsql写进.env,再运行config:cache,缓存文件里就固定了'default' => 'pgsql',后续即使删掉.env,Laravel 依然会去找connections.pgsql配置 - 但如果
connections.pgsql本身含env()(如'host' => env('DB_HOST')),那这部分也会被展开并固化进缓存
线上环境必须清缓存才能让新的 .env 数据库配置生效
常见误操作:改完 .env 里的 DB_DATABASE,只 reload PHP-FPM 或重启 Nginx,页面仍连旧库。原因就是 config 缓存没更新。正确做法只有两个:
- 运行
php artisan config:clear && php artisan config:cache(推荐,尤其部署脚本中) - 或者删掉
bootstrap/cache/config.php文件后手动触发一次请求(不推荐,容易漏)
注意:config:clear 不会清除 cache 或 view 缓存,只动 config.php;而 cache:clear 是另一回事,别混。
真正容易被忽略的是:config 缓存一旦生成,.env 就彻底失联了 —— 它既不被读取,也不会报错提示你改错了。上线前务必确认 config:cache 命令执行成功,且输出里没有 Warning 或 Exception。


















