laravel
运行 `
php
artisan config:cache` 后,`.env` 文件中的变量(如 `db_host`)不再被 `env()` 函数读取,但配置项仍可正常生效(如邮件发送);此时应统一通过 `config()` 辅助函数访问已加载的配置值。
在 Laravel 8 中,php artisan config:cache 命令会将所有
配置文件
(如 config/database.php、config/mail.php)编译为一个高度优化的 PHP 数组并写入
bootstrap
/cache/config.php。该缓存
不包含 .env 文件本身
,而是将 .env 中的值
在构建时解析并固化到配置数组中
——这意味着:
✅ config('mail.driver')、config('database.connections.
mysql
.host') 等调用完全可用(邮件能正常发送);
❌ env('DB_HOST')、env('MAIL_PASSWORD') 等直接读取 .env 的方式
将始终返回 null
(因为运行时不再加载 .env)。
这是 Laravel 的
预期行为与安全设计
:避免在生产环境反复解析 .env 文件,同时防止敏感变量意外泄露(例如通过 phpinfo() 或调试输出暴露原始 env() 调用)。
✅ 正确做法:始终使用 config(),而非 env()
将代码中所有 env('KEY') 替换为对应的配置路径。例如:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
? 提示:config() 支持点号语法(dot notation),对应配置文件中的嵌套结构。你可在 config/database.php 中找到 'connections' => ['mysql' => [... 'host' => env('DB_HOST', '127.0.0.1'), ...]] —— 缓存时 env('DB_HOST') 已被求值并写入,后续只需 config('database.connections.mysql.host')。
⚠️ 注意事项
开发阶段无需频繁执行 config:cache
:仅在部署到生产环境前执行一次即可;本地开发建议保持未缓存状态以支持 .env 动态修改。
禁止在配置文件外使用 env()
:Laravel 官方文档明确指出:“
You should never use the env function outside of configuration files.
”
自定义配置需同步更新
:若你创建了 config/custom.php 并在其中引用 env('CUSTOM_API_KEY'),请确保该值已正确注入配置数组,并通过 config('custom.api_key') 访问。
清除缓存后(config:clear)env() 恢复可用,但这是临时绕过,
不是解决方案
——它违背了配置缓存的设计初衷,且上线后不可靠。
✅ 总结
场景env('KEY')config('xxx.yyy')推荐操作未执行 config:cache✅ 可用✅ 可用开发期可用,但应逐步迁移至 config()已执行 config:cache❌ 返回 null✅ 安全稳定必须使用 config()生产环境部署❌ 禁止使用✅ 强制要求所有环境统一编码规范
遵循这一原则,既能保障应用性能与安全性,又能彻底规避“邮件能发、数据库连不上”这类看似矛盾的问题。
// ❌ 错误:缓存后失效
$host = env('DB_HOST', '127.0.0.1');
// ✅ 正确:从已缓存的配置中读取
$host = config('database.connections.mysql.host', '127.0.0.1');
// 同理,邮箱配置
$mailFrom = config('mail.from.address', 'no-reply@example.com');