队列任务失败不会自动显示错误提示,因yii\queue在命令行进程执行,与web请求隔离,异常仅写入日志或failed表;需主动配置logbehavior、避免吞异常、并从日志或queue_failed表中提取错误信息。

队列任务失败本身不会自动显示错误提示,它只记录日志或进 failed 表——你要主动查、主动看、主动抛。
为什么 web 页面看不到队列执行错误
Yii2 的 yii\queue 是后台命令行驱动的,和 Web 请求完全隔离。任务在 php yii queue/listen 进程里执行,出错时 PHP 错误不会冒泡到浏览器,也不会触发 Yii::$app->errorHandler 的 site/error 页面。
- Web 界面(如 yii2-queue-web 面板)只读取数据库/Redis 中的状态字段,不捕获执行时的异常堆栈
- 即使任务
throw new Exception('xxx'),错误也只写进 PHP 错误日志或queue组件配置的LogBehavior日志里 - 如果你没配
'as log' => \yii\queue\LogBehavior::class,失败连日志都没,只剩 silent fail
怎么让失败错误“可看见”
关键不是“显示”,而是“落地”:把错误内容存进能查的地方,再用你习惯的方式读出来。
- 确保队列组件已启用日志行为:
'as log' => \yii\queue\LogBehavior::class,否则execute()抛异常后只有空记录 - 在 job 类的
execute()里别吞异常:不要try/catch后return或echo,要让异常穿透出去,才能触发重试+日志记录 - 查日志路径:默认写进
@runtime/logs/app.log,搜索关键词Queue或任务类名;也可在config/console.php中为LogBehavior单独配logger目标 - DB 驱动下,失败任务会进
queue_failed表(需 migration),字段error存的是序列化的异常信息,可用unserialize()+getMessage()提取
如何在 Web 端主动展示队列错误
没有开箱即用的“错误弹窗”,但你可以用最简方式把错误暴露给前端人员。
- 写个 admin action,读
queue_failed表或日志文件,用nl2br()渲染堆栈,仅限 YII_DEBUG=true 或内网 IP 访问 - 在任务类中手动写日志:
Yii::error($e->getMessage() . "\n" . $e->getTraceAsString(), 'queue-job'),比 LogBehavior 更可控 - 如果用了 Redis 驱动且开了
asArray,queue:failed:list里有原始异常字符串,可直接GET拿 - 别依赖 AJAX 调用面板的“重试”按钮来发现错误——它 403 报错只是 CSRF 问题,和任务失败无关
真正容易被忽略的是:队列错误从不“自动浮现”,它永远躲在日志、failed 表、或者 worker 进程的标准输出里。你得决定让它去哪儿,而不是等它自己跳出来。











