symfony命令行环境切换关键在于运行时app_env真实生效并正确加载配置:需前置设置app_env=prod等,禁用已弃用的--env参数;环境变量引用必须用%env(resolve:var)%语法;生产环境应预编译.env.local.php而非实时解析.env文件;通过debug:dotenv、debug:config、debug:container命令验证环境是否真正生效。

Symfony命令行环境切换,关键不在改文件名,而在于让APP_ENV在执行时真实生效,并确保配置能被正确加载和解析。命令本身不“记住”环境,它完全依赖运行时的环境变量状态。
命令执行前必须设对APP_ENV
CLI下运行命令时,APP_ENV需明确设置,否则默认为dev。推荐方式是直接在命令前加环境变量:
APP_ENV=prod php bin/console cache:clearAPP_ENV=test php bin/console doctrine:migrations:migrate- 避免只写
php bin/console --env=prod ...——该参数已被弃用,仅部分旧命令支持,不可靠
敏感值必须用%env(resolve:VAR)%语法
在config/packages/*.yaml中引用环境变量时,裸写%env(DATABASE_URL)%只会当字符串处理,不会解析。必须加resolve:前缀才能展开变量、执行默认值或命令替换:
- ✅ 正确:
database_url: '%env(resolve:DATABASE_URL)%' - ❌ 错误:
database_url: '%env(DATABASE_URL)%'(生产部署后可能连不上库) - 类型转换如
%env(bool:APP_DEBUG)%也必须搭配resolve:才生效
生产环境命令要配合dotenv:dump
线上服务器不应依赖.env.*文件实时解析——每次请求都解析有性能开销,且loadEnv()在Web服务器启动后可能已关闭。正确做法是预编译:
- 本地构建阶段执行:
php bin/console dotenv:dump --format=php --env=prod - 生成
.env.local.php,包含已解析的全部变量 - 部署时只传这个PHP文件,不传任何
.env.*文本文件 - 此时
APP_ENV=prod命令可直接运行,无需再加载Dotenv
验证命令是否真走对了环境
别凭感觉判断环境是否生效,用内置命令确认:
-
php bin/console debug:dotenv→ 查看哪些.env文件被加载、变量是否解析成功 -
php bin/console debug:config framework --env=prod→ 看framework配置块是否已应用prod覆盖项(比如缓存适配器是否变成redis) -
php bin/console debug:container --env-var=DATABASE_URL→ 直接查最终生效的数据库连接串











