yii2仅识别yii_env常量且值必须为字符串'dev',不支持yii_env_dev等变体;gii和debug需同时满足yii_debug===true且yii_env==='dev'才启用。

YII_ENV_DEV 没生效,根本不是环境变量没传进去,而是 Yii2 根本不认这个常量名——它只认 YII_ENV,且值必须是字符串 'dev',不是布尔值、不是 YII_ENV_DEV、也不是 true。
YII_ENV 和 YII_ENV_DEV 是两回事
Yii2 源码里所有环境判断都基于 YII_ENV 这个常量,比如 if (YII_ENV === 'dev')。不存在 YII_ENV_DEV 这个内置常量,它不会被框架读取或解析。如果你在 .env 文件里写 YII_ENV_DEV=true,或者在 Docker 启动时传 -e YII_ENV_DEV=1,Yii2 完全无视。
- 正确做法:容器或部署脚本中必须传
YII_ENV=dev(注意是字符串,不是布尔) - 入口文件
web/index.php中必须用defined('YII_ENV') or define('YII_ENV', 'dev');,不能写成define('YII_ENV_DEV', true) - 如果用了
getenv()动态读取,确保返回的是字符串'dev',而不是整数1或布尔true
YII_DEBUG 为 true 但 YII_ENV 不是 'dev',Gii/debug toolbar 依然不加载
Yii2 的开发组件(gii、debug)启动前会双重校验:YII_DEBUG === true 且 YII_ENV === 'dev'。缺一不可。只开 YII_DEBUG,modules 配置里的 gii 模块压根不会注册,路由 404,静态资源目录(如 gii/assets)也不会发布,报错提示 “The file or directory to be published does not exist” 就是这个原因。
- 检查
web/index.php是否同时定义了两个常量,顺序无关,但都得存在 - 运行
php web/index.php(CLI 模式)看是否报错——CLI 下若YII_ENV未定义,getenv('YII_ENV')返回false,?: 'dev'才兜底;但 Web 模式下某些 SAPI 可能不支持getenv,建议硬编码兜底 -
config/web.php中的modules配置不会被自动跳过,但如果YII_ENV !== 'dev',模块类根本不会实例化,allowedIPs等配置也就无从谈起
PHP-FPM / Nginx / Docker 中环境变量被覆盖或未透传
Docker 容器内、PHP-FPM pool 配置、Nginx 的 fastcgi_param 都可能屏蔽或重写环境变量。尤其 PHP-FPM 默认禁用 getenv(),且 php_admin_flag[variables_order] 若不含 E,getenv() 就读不到系统环境变量。
- Docker 启动时用
-e YII_ENV=dev -e YII_DEBUG=1,别依赖.env文件 - PHP-FPM 配置(如
www.conf)中确认有env[YII_ENV] = dev和env[YII_DEBUG] = 1 - Nginx 的
fastcgi_param块里加一行:fastcgi_param YII_ENV $php_env_yii_env;,并在map块中定义$php_env_yii_env,否则变量传不到 PHP - 最稳方案:在
web/index.php开头直接define('YII_ENV', 'dev');,绕过所有外部变量干扰
真正卡住的人,往往在 docker-compose.yml 里写了 YII_ENV_DEV: "1",却没意识到 Yii2 压根不查这个键——它只盯着 YII_ENV 这三个字母,且只接受字符串 'dev'。其他任何变体,都会让 Gii、Debug Toolbar、错误堆栈全部静默失效。











