php artisan config:cache 将 config/ 目录下所有 php 配置文件加载、执行逻辑并序列化为单个 bootstrap/cache/config.php,后续 config() 调用直接读取该文件,跳过多次 i/o 和解析;它只在生成时求值 env(),不支持运行时 .env 修改,且要求环境正确、无闭包/未加载类/语法错误,否则失败。

配置缓存不是“设一下就完事”,而是必须在部署后执行 php artisan config:cache 才真正生效;不执行这一步,.env 里的修改永远只在运行时被逐个 require,性能毫无提升。
config:cache 命令到底干了什么
它把 config/ 目录下所有 PHP 配置文件(比如 app.php、database.php)全部加载一遍,执行其中的逻辑(如环境判断、数组合并),最终序列化成一个纯数组,写入 bootstrap/cache/config.php。后续所有 config('app.name') 调用都直接从这个单文件读,跳过 20+ 次文件 I/O 和 PHP 解析。
- 该文件是 PHP 可执行代码,不是 JSON 或 YAML,所以不能手动编辑
- 一旦生成,
config()就完全忽略原始配置文件和.env的实时变化 - 如果配置里用了
env()函数(比如'host' => env('DB_HOST', '127.0.0.1')),它只在缓存生成那一刻求值,之后再改.env无效
为什么 config:cache 失败或不生效
常见报错如 Undefined variable: env 或 Class 'App\Providers\AppServiceProvider' not found,本质都是缓存生成阶段执行了不该执行的代码。
-
.env文件语法错误(漏引号、换行符混乱、用了中文等号)会导致env()返回 null,进而让依赖它的配置项崩掉 - 在配置文件里直接调用未加载的类(比如
config/app.php中写了App\MyHelper::value())——此时 autoloader 还没 fully ready - 配置文件中用了闭包(
'log' => function () { ... })——序列化失败 - 执行命令时未切换到生产环境:确保
APP_ENV=production已设,否则某些开发专用配置(如debugbar)会参与缓存,引发冲突
缓存更新后哪些地方要特别注意
配置缓存不是“一劳永逸”,它改变了整个配置系统的读取路径和时机,很多你以为安全的操作其实会失效。
- 改完
.env后,必须运行php artisan config:clear+php artisan config:cache,否则新值不会进入缓存文件 -
php artisan tinker中调用config(['app.name' => 'test'])是运行时覆盖,只对当前请求有效;重启 tinker 或刷新页面就恢复缓存值 - 部署脚本里如果漏了
config:cache,哪怕其他优化全做了,配置层仍拖慢首字节响应时间(TTFB)30–80ms - 多服务器部署时,确保每台机器都独立执行缓存命令,不要共享
bootstrap/cache/config.php文件(可能因路径或权限不一致导致加载失败)
最常被忽略的一点:缓存文件本身有权限问题。如果 bootstrap/cache 目录不可写,命令看似成功,实则没生成文件,或者生成了但 Web 服务器用户(如 www-data)无权读取——这时候你得检查 ls -l bootstrap/cache/ 和 Web 服务日志里的 open_basedir 或 permission denied 提示。











