升级yii2后页面空白或报错无提示,本质是错误被静默吞掉:需在web/index.php开头插入error_reporting(e_all); ini_set('display_errors', '1');并确认yii_debug=true,且两行须位于require autoload.php之前。

升级 Yii2 后页面空白或报错但没提示,本质是错误被静默吞掉——不是没出错,而是你根本看不到它。
为什么升级后错误不显示
Yii2 默认在非调试模式下屏蔽所有 PHP 错误和异常堆栈,尤其升级后常触发致命错误(如 Class 'CController' not found、Cannot use 'Object' as class name),这些错误直接导致脚本中断,但浏览器只返回 500 或空白页。
- YII_DEBUG 关闭时,
errorHandler会渲染友好的错误页,而非原始报错 - PHP 配置中
display_errors=Off或log_errors=On会让错误只写日志不输出 - Composer 升级后若自动加载失效(如
vendor/autoload.php路径错乱),连 Yii 类都载不进来,errorHandler根本没机会启动
强制让错误浮出来(必须做)
打开 web/index.php,在文件最开头插入两行(位置不能错):
error_reporting(E_ALL);
ini_set('display_errors', '1');
再确认下面这行已启用:
defined('YII_DEBUG') or define('YII_DEBUG', true);
- 这两行要放在
require __DIR__ . '/../vendor/autoload.php';之前,否则 autoload 失败时它们也执行不到 - 如果仍空白,检查 Web 服务器是否覆盖了 PHP 的
display_errors(如 Nginx 的php_admin_flag display_errors off) - Windows IIS 用户还需确认
fastcgi.logging = 0未关闭错误日志转发
常见升级报错对应的真实提示怎么看
加完上面两行后,典型报错会直接显示在浏览器,无需查日志:
-
Class 'CController' not found→ 还在用 Yii1 风格控制器,需改为extends yii\base\Controller -
Call to undefined method Yii::app()→ 没把Yii::app()全局替换成Yii::$app -
Cannot use 'Object' as class name→ PHP 7+ 保留字冲突,说明 Yii 版本太老,必须composer update yiisoft/yii2 -
Class 'yii\widgets\ActiveForm' not found→use yii\widgets\ActiveForm;漏了,或命名空间迁移不完整 -
Class 'Yii' not found→vendor/autoload.php路径不对,或mbstring/intl扩展未启用
升级后提示还是不显示?检查 runtime 权限和入口路径
即使开了 display_errors,若 runtime 目录不可写,Yii 无法生成日志和缓存,错误处理器可能初始化失败。
- Linux:运行
chmod -R 777 runtime web/assets(临时排查用) - Windows:确认
web/index.php中require的路径是../vendor/autoload.php,不是../../vendor/autoload.php(常见于重写根目录后路径偏移) - 宝塔/Nginx 用户:检查网站根目录是否指向
/web子目录,而非项目根目录——否则__DIR__计算出的路径全错
真正卡住的地方往往不是代码逻辑,而是 web/index.php 开头那几行和服务器对 PHP 配置的实际控制权。升级报错提示不出来,90% 是这两块没对齐。











