app_env切换需在cli命令前显式声明,如app_env=prod php bin/console cache:clear;.env中设置对cli无效,--env参数已弃用,须用debug:dotenv等命令验证实际生效环境。

APP_ENV 切换不是改配置文件,而是每次运行命令时显式声明环境变量。不设或设错,bin/console 就默认走 dev,哪怕你已经改了 .env 里的 APP_ENV=prod —— 那个只对 Web 请求(通过 loadEnv())生效,对 CLI 命令完全无效。
CLI 下必须前置设置 APP_ENV=xxx
所有 bin/console 命令都依赖当前 shell 环境变量,不是读取 .env 文件:
- ✅ 正确:
APP_ENV=prod php bin/console cache:clear - ✅ 正确:
APP_ENV=test php bin/console doctrine:migrations:migrate - ❌ 错误:
php bin/console --env=prod cache:clear(--env参数已弃用,仅旧版部分命令支持,不可靠) - ❌ 错误:
export APP_ENV=prod && php bin/console cache:clear(虽然能生效,但污染当前 shell,后续命令全被带偏,不推荐)
开发时建议写成 alias 或 Makefile,避免手误漏写。
APP_ENV=prod 命令报错“Class not found”或“500”?
常见于首次在生产环境运行命令,原因不是环境没切对,而是缓存没预热或 dotenv 没预编译:
-
APP_ENV=prod下,cache:clear会尝试加载config/packages/prod/*.yaml,但若.env.prod.local未被识别(因为 Web 服务器没设APP_ENV),或dotenv:dump没执行过,就会因环境变量缺失导致服务容器构建失败 - 必须先跑:
php bin/console dotenv:dump --format=php --env=prod,生成.env.local.php - 再清缓存:
APP_ENV=prod php bin/console cache:clear - 首次部署还缺一步:
APP_ENV=prod php bin/console cache:warmup,否则路由、翻译等缓存为空,直接 500
验证 APP_ENV 是否真生效
别信配置文件,要看运行时实际加载的参数:
- 查内核参数:
APP_ENV=prod php bin/console debug:container --parameter=kernel.environment,输出应为prod - 查当前配置来源:
APP_ENV=prod php bin/console debug:config framework,看default_locale、timezone等是否是你config/packages/framework.yaml中绑定的%env(APP_LOCALE)%值 - 检查环境变量解析:
APP_ENV=prod php bin/console debug:dotenv,确认DATABASE_URL等关键变量是否已展开,而非原样显示%env(resolve:DATABASE_URL)%
真正容易被忽略的是:Web 服务器(Nginx/Apache)和 CLI 是两套独立的环境变量上下文。你在终端设了 APP_ENV=prod,不代表 PHP-FPM 进程也看到它——线上部署必须在 Web 服务器配置里显式传递,比如 Nginx 的 fastcgi_param APP_ENV prod。











