Yii调试需YII_DEBUG与YII_ENV同时正确设置,YII_DEBUG控制错误显示,YII_ENV=‘dev’触发debug模块加载,且必须注册debug模块、配置allowedIPs、bootstrap启动,并匹配日志level和categories。

调试模式不是“开了就能用”,而是必须和环境标识、日志通道、入口加载三者对齐,缺一不可。单独改 YII_DEBUG 常量或只配 'debug' => true 很可能没效果。
YII_DEBUG 常量和 YII_ENV 环境变量必须同时设对
Yii 的调试行为由两个底层常量共同控制:YII_DEBUG 决定是否显示堆栈和源码上下文,YII_ENV 决定是否加载调试模块(如 yii\debug\Module)和启用开发级日志级别。只开一个,另一部分功能会静默失效。
-
YII_DEBUG必须在应用启动最早期定义,推荐放在web/index.php顶部(require __DIR__ . '/../vendor/autoload.php';之前) -
YII_ENV推荐设为'dev',而不是'development'或其他值——Yii 内部硬编码识别'dev'才会自动注入debug模块 - 不要在
config/web.php里用if (YII_ENV_DEV) { ... }包裹调试配置:这个常量是 Yii 自己根据YII_ENV定义的,你还没定义YII_ENV就去用它,结果永远是false
debug 模块必须显式注册且限制 IP
光有 YII_DEBUG 和 YII_ENV,页面底部不会出现调试面板。你得手动把 yii\debug\Module 加进配置,并确保它只对可信 IP 开放。
- 在
config/web.php的$config['modules']中添加:'debug' => ['class' => 'yii\debug\Module', 'allowedIPs' => ['127.0.0.1', '::1']] -
allowedIPs默认是['127.0.0.1'],但如果你用 Docker、WSL 或远程开发机,必须加上对应宿主机或网关 IP,否则面板返回 403 - 确认
$config['bootstrap'][] = 'debug';已存在,否则模块不会提前初始化,导致某些请求生命周期内的调试数据丢失
日志级别和路由必须匹配 trace/info,且 category 对应
很多开发者开了调试却看不到 SQL 查询、路由匹配或事件触发日志,问题往往出在日志目标没接收到对应 category 的消息。
- Yii 调试模块内部大量使用
\Yii::trace()和\Yii::info(),它们默认属于'application'或具体组件 category(如'yii\db\Command'、'yii\web\UrlManager') - 在
log组件的targets中,必须明确指定'levels' => ['trace', 'info'],不能只写'error, warning' - 如果只想看数据库日志,加
'categories' => ['yii\db*'];想看路由匹配,必须写'categories' => ['yii\web\UrlManager'],通配符*有效,但'yii\web'不会命中'yii\web\UrlManager' - 文件日志路径建议用别名,比如
'logFile' => '@runtime/logs/debug.log',避免权限或路径错误导致日志静默丢弃
常见“开了但没反应”的真实卡点
不是配置写错了,而是执行链断在了你看不见的地方。
- 入口脚本不是
web/index.php:比如你用php yii serve启动,它走的是 console 配置,web.php根本不加载;或者用了自定义入口如api/index.php,但没同步复制调试配置 - Apache/Nginx rewrite 规则没生效:访问
/site/index返回 404,但/index.php/site/index正常——说明请求根本没进 Yii,UrlManager 压根没运行,所有路由和调试日志都不会触发 - PHP 错误被 @ 抑制:某些老代码在创建组件前加了
@new UrlManager(),导致构造异常被吞,后续parseRequest()不执行,trace 日志也消失 - OPcache 缓存了旧配置:改完
web.php没清 opcache,或者用的是 CLI 模式跑的测试(php yii),和 Web 请求用的不是同一份配置缓存
最易被忽略的一点:调试模式开启后,error_log 输出会被重定向到 Yii 日志系统,原生 error_log() 调用不再写入 PHP 错误日志文件——这意味着你如果依赖 tail -f /var/log/php_errors.log 查问题,会发现它突然“变空”了。


















