Yii2开发模式下不显示错误堆栈,主因是YII_DEBUG与YII_ENV未同时设为true和'dev',且PHP error_reporting、display_errors未开启,或maxSourceLines配置过小。

开发模式下 Yii2 不显示错误堆栈,基本是因为 YII_DEBUG 没真正生效,或被其他配置/环境覆盖。必须手动确认并加固调试开关,否则你看到的永远是空白 500 或“页面无法访问”。
确认 YII_DEBUG 和 YII_ENV 是否同时为 true/dev
Yii2 的堆栈显示依赖两个常量协同生效:YII_DEBUG 控制是否开启调试逻辑,YII_ENV 决定是否加载开发环境组件(比如 debug 模块、宽松的错误处理器)。只开一个没用。
- 打开
web/index.php,检查前两行是否类似这样:
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
- 如果
YII_ENV是'prod'或'test',即使YII_DEBUG === true,yii\web\ErrorHandler也会降级为只跳转到site/error,不渲染堆栈 - 某些部署脚本或 Dockerfile 会通过环境变量覆盖这两个值,建议在入口文件顶部加一行验证:
var_dump(YII_DEBUG, YII_ENV); die();
- 确保没有在
config/web.php或其他配置中通过define()二次覆盖——PHP 常量不能重定义,后设的会静默失败
强制暴露 PHP 错误和堆栈的临时补丁
即使 YII_DEBUG 开了,PHP 自身的错误报告级别和输出开关仍可能屏蔽 notice/warning 或截断堆栈。尤其 Windows 下常见 ini 设置残留问题。
- 在
web/index.php开头(require __DIR__ . '/../vendor/autoload.php';之前)插入:
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
- 这三行能确保
Undefined variable、Undefined array key这类 notice 级错误也立刻浮现,而不是被 Yii 静默吞掉再抛出空异常 - 注意:仅限本地开发;上线前必须删掉,否则可能泄露敏感信息
- 如果用了 XAMPP/MAMP,还要检查 php.ini 中
error_reporting和display_errors是否被设为Off—— 代码里的ini_set可能被禁用(查看disable_functions)
Console 命令里看不到堆栈?加 --verbose
Yii2 Console 应用默认不显示完整异常堆栈,哪怕 YII_DEBUG 已开。它把日志级别锁在 info,trace 和异常详情被过滤掉了。
- 运行命令时必须显式加上
--verbose参数:
php yii my-command/do-something --verbose
-
--verbose会提升日志等级到trace,并强制打印未捕获异常的完整堆栈(含 vendor 路径、参数绑定、SQL 实际值) - 若仍只看到
Exception: xxx一行,说明异常被某层try/catch吞了但没 re-throw;此时在 catch 块里加throw $e;或Yii::error($e);才能看到根因 - 别依赖
Yii::$app->errorHandler->exception($e)在 console 里渲染堆栈——ErrorAction是 Web 组件,console 下不生效
堆栈里看不到源码上下文?调大 maxSourceLines
即使堆栈出来了,也可能只显示“第 42 行出错”,点不开源码片段。这是 yii\web\ErrorHandler 的默认限制在起作用。
- 在应用配置(如
config/web.php)的components下调整:
'errorHandler' => [
'maxSourceLines' => 30,
'maxTraceSourceLines' => 25,
],
-
maxSourceLines控制错误页上显示的出错文件上下文行数(默认 19) -
maxTraceSourceLines控制堆栈中每个调用帧显示的源码行数(默认 13),对定位 vendor 里哪行触发的问题很关键 - 这两个值设太大可能导致页面卡顿或暴露过多无关代码,本地开发设到 30–50 足够
- 注意:该配置仅对 Web 请求生效,console 命令的堆栈格式由
yii\console\ErrorHandler控制,不读这个配置
最常被忽略的是:YII_ENV 值不对,或者 display_errors 被 php.ini 硬性关闭。堆栈不是“开了调试就自动出来”的功能,它是一连串开关串联的结果——漏掉任意一环,你就只能对着空白页猜。


















