.env.local是Symfony项目中唯一应存本地敏感值的文件,它不进Git、不被部署、仅在本机生效;.env只放默认值(如APP_ENV=dev),因易误提交导致密钥泄露,故密码等绝不可写入。

.env.local 是 Symfony 项目中唯一该存本地敏感值的文件,它不进 Git、不被部署、只在你自己的机器上生效。
为什么不能把密码写进 .env
因为 .env 默认会被提交到代码仓库——它设计来放默认值(比如 APP_ENV=dev、MAILER_DSN=smtp://localhost),不是放密码的地方。一旦误传,数据库账号、API 密钥全暴露。
-
.env.local必须加进.gitignore,这是硬性要求 - 它不会被部署脚本带走,也不会出现在 CI/CD 环境里
- Symfony 加载顺序是
.env→.env.local,后者能覆盖前者所有变量
.env.local 和 .env.prod.local 的区别
.env.local 是“当前机器专属”,而 .env.prod.local 是“生产环境机器专属”——但后者只有在 APP_ENV=prod 已经设好时才加载。
- 开发时用
.env.local:比如DATABASE_URL=sqlite:///%kernel.project_dir%/var/app.db - 生产服务器上,应设系统级
APP_ENV=prod(如 Nginx 的fastcgi_param APP_ENV prod),再放.env.prod.local存 MySQL 密码 - 如果只是运行
php bin/console cache:clear --env=prod,.env.prod.local不会加载——--env参数已被弃用,不起作用
常见错误:DATABASE_URL 为空,但 .env.local 明明写了
现象:bin/console debug:container --env-var=DATABASE_URL 返回未定义,或 Doctrine 报 “URL is empty”。
- 检查
php -r "echo $_ENV['DATABASE_URL'] ?? 'not set';"是否输出空——说明 Dotenv 根本没加载成功 - 确认
.env.local没有语法错误:漏引号、${MISSING_VAR}未定义、换行符是\r\n(Windows 编辑器易出这问题) - 别在
config/packages/doctrine.yaml里写url: '%env(DATABASE_URL)%'—— 少了resolve:前缀,变量不会展开,只会当字面量字符串塞进去 - CLI 下执行命令前,确保环境变量已就位:
APP_ENV=dev DATABASE_URL=... php bin/console doctrine:database:create
真正容易被忽略的是:.env.local 的生效完全依赖 Dotenv 组件是否被调用,而 Web 服务器(如 Apache/Nginx)启动后,PHP 进程通常不再重新 loadEnv();所以它的作用域其实是「每个 PHP 请求初始化阶段」或「每次 CLI 命令执行起点」,而不是全局常驻。一旦你用了 dotenv:dump 编译成 .env.local.php,.env.local 文件本身就被绕过了——这点很多人部署后才发现配置没更新。


















