Yii2控制台命令默认静默失败,需加--interactive和--verbose参数才能显示完整错误堆栈、SQL绑定参数及配置错误行号;否则在YII_DEBUG=false或CI环境中几乎无报错信息。

不加 --interactive 和 --verbose,Yii2 控制台命令出错时大概率只给你一个空行、静默失败,或者一句模糊的 PHP Fatal error —— 你根本不知道错在哪一行、哪个类没加载、SQL 绑定参数有没有问题。
为什么默认不显示真实错误
Yii2 控制台在非调试模式下会把大部分 warning、notice 和未捕获异常吞掉,尤其当 YII_DEBUG = false 或命令运行在 CI 环境(如 GitHub Actions)中时,error_reporting 被压制,display_errors 关闭,连 PHP 原生报错都看不到。
- 数据库迁移失败只报
Integrity constraint violation,但不告诉你实际执行的是哪条 SQL -
Class 'xxx' not found错误可能源于vendor/autoload.php没加载成功,但控制台不提示 autoload 失败细节 - 配置文件语法错误(如
config/console.php中多了一个逗号)会导致命令直接退出,无任何堆栈
必须加的两个参数:--interactive 和 --verbose
它们不是“锦上添花”,而是让错误浮出水面的最低成本手段:
-
--interactive:强制命令逐行暂停,暴露$this->confirm()、$this->prompt()的实际返回值和输入内容;对没写交互逻辑的命令无效,但能帮你确认流程是否走到预期分支 -
--verbose:本质是把日志级别提到trace,并强制输出完整异常堆栈(含vendor/内部调用链),同时显示 SQL 实际绑定参数、PHP notice/warning、配置解析错误行号 - 组合使用示例:
php yii migrate/up 10 --interactive --verbose,你会看到 migration 类初始化、每个up()方法进入/退出、SQL 执行耗时、WHERE 条件生成过程
常见错误仍不显示?检查这几个硬性前提
加了参数还不行,说明环境或配置卡在更底层:
- 确认
web/index.php和yii入口脚本里都定义了defined('YII_DEBUG') or define('YII_DEBUG', true);—— 控制台命令走的是yii文件,不是index.php - 运行
php -m | grep -E "(mbstring|intl|openssl)",缺任一模块都会导致autoload.php初始化失败,后续所有类加载全崩,且无明确提示 - Windows 下若用 Git Bash 运行命令,
--verbose输出可能被截断或乱码,换用 PowerShell 或 CMD 重试 - 某些扩展(如
yii2-redis)在--verbose下会打印明文连接信息(host/port/password),上线前务必关掉,但调试时它正是定位连接失败的关键线索
绕过参数也能看错误的应急方法
当你无法加参数(比如在 CI 中被固定脚本调用),或参数加了还是黑屏,就靠这几招挖根因:
- 在
yii入口文件顶部插入:error_reporting(E_ALL); ini_set('display_errors', '1');,再运行命令 - 临时修改
console/config/main.php,在'components' => ['log' => [...]]里加一个FileTarget,确保'logFile' => '@runtime/logs/console.log',然后查该文件 - 手动触发异常测试:在命令
actionIndex()开头写throw new \Exception('test'); die;,看是否真能打出堆栈 —— 如果不能,说明错误处理器被覆盖或throwExceptions = false被设死
真正难排查的永远不是“报什么错”,而是“为什么这个错不报出来”。--interactive 和 --verbose 是 Yii2 控制台调试的呼吸阀,漏掉任何一个,你就等于在无氧环境里写代码。


















