要使Yii2短信异常可见,需禁用生产环境静默处理:确保YII_ENV≠prod,启用debug模块,避免try-catch吞异常,在关键处用echo+exit裸露输出错误详情,并结合服务商控制台日志定位网络、认证或业务层问题。

Yii2 短信服务报错默认不显示,是因为生产环境自动屏蔽了详细错误,必须主动配置才能看到真实异常信息。
如何让短信发送失败时抛出的错误可见
Yii2 的 yii\base\ErrorException 和底层 HTTP 请求异常(如 cURL 超时、SSL 验证失败)默认被 errorHandler 捕获并静默处理,尤其在 YII_ENV = prod 下只会返回 500 页面或空响应。
- 确保当前环境不是
prod:检查index.php中是否设置了defined('YII_ENV') or define('YII_ENV', 'dev'); - 在
config/web.php中显式启用调试:'bootstrap' => ['log', 'debug'],,并确认已安装yiisoft/yii2-debug - 短信逻辑里别用
try...catch吞掉异常却不记录——至少加一行\Yii::error($e);
常见短信错误类型及对应日志位置
多数短信 SDK(如阿里云、腾讯云、UCloud)在 Yii2 中封装后,失败时会抛出 yii\base\Exception 或其子类,但具体信息藏在异常的 getMessage() 或 $e->getPrevious() 里。
-
Connection refused或cURL error 7→ 检查服务器能否访问短信服务商域名(如sms.tencentcloudapi.com),用curl -v https://...测试 -
Invalid signature或AuthFailure.SignatureFailure→ 密钥、时间戳、签名算法不匹配,重点核对SecretId/SecretKey和生成签名的参数顺序 -
InvalidConfigException报在AssetManager.php→ 这是干扰项,和短信无关,别被带偏(见知识库中那个权限报错)
调试时强制输出短信异常的最小代码片段
在调用短信服务的方法里临时加一段裸露输出,绕过 Yii 的错误处理器:
try {
$result = $smsService->send(['phone' => '138xxxxxx', 'template' => 'login']);
} catch (\Exception $e) {
// 强制打印原始错误,避免被 errorHandler 吞掉
echo '<pre class="brush:php;toolbar:false;">' . print_r([
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString()
], true) . '';
exit;
}
这段代码只用于定位问题,上线前必须删掉或改用 \Yii::error() 记录到日志文件。
真正难的不是看到报错,而是区分错误来自网络层、认证层还是业务层。比如 403 Forbidden 可能是 API 密钥失效,也可能是 IP 白名单没加,还可能是短信模板未审核通过——得结合服务商控制台的「请求日志」交叉验证。











