Laravel执行config:cache后.env无法读取,因框架仅加载bootstrap/cache/config.php且env()被禁用;应改用config()访问已缓存配置,并确保env()仅用于config/*.php文件中。

命令行无法读取 .env,绝大多数情况不是文件本身坏了,而是 Laravel 启动流程跳过了它——尤其是执行过 php artisan config:cache 之后。
配置缓存已启用,env() 直接失效
一旦运行过 config:cache,Laravel 就不会再加载 .env 文件。此时调用 env('DB_HOST') 永远返回 null,哪怕你在命令行里执行也一样。
- 这是设计行为,不是 bug:缓存后框架只读
bootstrap/cache/config.php,不再解析文本文件 -
config()仍完全可用,因为配置值已在缓存生成时从.env提取并固化进数组 - 临时验证?运行
php artisan config:clear,env()就能恢复——但这只是调试手段,不能写进正式逻辑
env() 用错了地方
Laravel 官方明确要求:env() 只允许出现在 config/ 目录下的 PHP 配置文件中(如 config/database.php),其他任何地方——包括命令行类、任务、服务容器绑定、甚至 routes/console.php ——都不该直接调用。
- 错误示例:
Artisan::command('sync:data', function () { $key = env('API_KEY'); ... }); - 正确做法:在
config/services.php中定义'api_key' => env('API_KEY'),然后命令行里写config('services.api_key') - 这样既兼容缓存,又符合框架约定
权限或路径问题被忽略
命令行和 Web 请求使用的是同一套启动逻辑,但运行用户可能不同。比如用 www-data 跑 Web,却用 root 或普通用户跑 Artisan 命令。
- 检查
.env是否真在项目根目录:ls -la | grep .env - 确认权限合理:
chmod 644 .env(777 会被 Laravel 主动拒绝) - Docker 环境要特别注意:
.env必须挂载进容器,且 PHP 进程工作目录必须是项目根目录
APP_ENV 或 APP_DEBUG 影响启动判断
如果 .env 里 APP_ENV=production 但实际想本地调试,某些环境检测逻辑可能提前终止 .env 加载。
- 临时加一句测试:
php artisan tinker -n --execute="dd(app()->environment(), $_ENV['APP_ENV'] ?? 'not set');" - 确保
APP_ENV值合法(local、staging、production),且没被系统级环境变量覆盖 - 若用
php artisan serve,可显式指定:php artisan serve --env=local


















