Yii2推送服务报错默认静默,需先启用YII_DEBUG和display_errors;HTTP推送须检查$response->isOk及业务码,WebSocket或队列失败应写库+前端轮询;自定义组件应返回结构化错误数组供控制器处理。

Yii2 推送服务(如 WebSocket、HTTP 请求调用第三方推送接口)报错时,默认不会主动显示提示——它既不走 ActiveForm 验证流程,也不触发 addError(),更不会自动渲染到视图。你看到的往往是静默失败、500 页面、或前端卡在 loading 状态。关键不是“怎么显示”,而是“错误有没有被捕获并传递到能展示的地方”。
推送失败时没报错信息?先确认调试模式已打开
这是所有后续排查的前提。推送失败常发生在异步请求、后台任务或 API 调用中,若 YII_DEBUG 关闭,异常会被 ErrorHandler 拦截并转成白屏或通用 500,根本看不到真实错误。
- 打开
web/index.php,确认存在且未注释:defined('YII_DEBUG') or define('YII_DEBUG', true); - 同时检查是否设置了
defined('YII_ENV') or define('YII_ENV', 'dev'); - 若仍无堆栈,加两行强制输出:
error_reporting(E_ALL); ini_set('display_errors', '1');(仅限开发环境)
HTTP 推送(如调用极光、个推、自建 API)报错怎么捕获并提示
这类推送本质是 curl 或 yii\httpclient\Client 发起的请求,失败不会自动抛异常,必须手动检查响应状态和业务码。
- 不要只依赖
try/catch,很多 HTTP 错误(如 400、401、502)不会触发 PHP 异常,而是返回正常响应体但含错误字段 - 用
$response->isOk判断 HTTP 状态码是否为 2xx;再用$response->data['errcode'](以微信为例)或$response->data['code']判断业务逻辑是否成功 - 把错误信息存到 session 或 flash 中,再重定向回原页面:
Yii::$app->session->setFlash('error', '推送失败:' . $msg); - 在视图里用
Yii::$app->session->getFlash('error')渲染提示,避免刷新后丢失
WebSocket 或后台任务推送失败,前端怎么收到提示
这类场景错误发生在服务端长连接或异步队列中,前端无法直接感知。必须设计反馈通道。
- 不要让推送逻辑直接 echo 或 return,而要写入数据库或 Redis 标记状态,例如
push_log表中新增status = 'failed'和error_msg字段 - 前端轮询(或用 SSE)检查该记录,拿到
error_msg后用alert()或 toast 显示 - 若用 Yii2 的
yii\queue,可在 job 的execute()中捕获异常,并调用Yii::$app->session->setFlash()不生效(无 session 上下文),应改用日志 + 前端查库方式 - 避免在 WebSocket handler 中直接
throw new Exception()——它只会断开连接,前端收不到结构化错误
自定义推送组件里怎么统一处理错误并透出提示
如果你封装了 PushService 类,错误提示不能只靠 echo 或 log,得提供可被控制器调用的错误出口。
- 方法返回值统一为数组:
['success' => false, 'message' => 'token 过期', 'code' => 401],而非抛异常 - 在控制器中接收后,按需处理:
if (!$result['success']) { $this->addError('push', $result['message']); },这样ActiveForm能自动显示 - 若非表单场景,用
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;直接返回错误结构,前端解析message字段 - 注意:不要在组件里直接调用
$this->addError(),除非它继承自Model;否则会报Call to undefined method
最易被忽略的一点:推送失败的“错误”往往不在代码里,而在网络超时、SSL 证书过期、域名 DNS 解析失败、或对方服务返回了 HTML 页面(比如 Nginx 502 页面)却被当 JSON 解析——这些情况必须检查原始响应体($response->content),而不是只看 $response->data。











