Yii2.0.51 短信接口配置教程【通知】

冬伟大大_7937

冬伟大大_7937

2026-08-09

861人浏览

原创

必须手动注册独立短信客户端组件并配置超时与重试逻辑,否则会导致发送失败无日志、错误码被吞、连接池耗尽;需在components中配置sms组件,timeout设为8秒以上,smsclient需继承component、注入独立httpclient,解析响应code并实现指数退避重试,控制器中通过$this->sms或di调用。

yii2.0.51 短信接口配置教程【通知】

Yii2.0.51项目中接入短信服务时,必须绕过框架默认的邮件组件路径,手动注册独立的短信客户端实例;不配置全局组件别名、不显式绑定依赖、不处理HTTP超时与重试逻辑,会导致发送失败无日志、错误码被吞、高并发下连接池耗尽。

注册短信客户端为应用组件

打开config/web.php(Web应用)或config/console.php(命令行应用),在'components'数组内添加短信服务配置项:

'sms' => [
  'class' => 'common\components\SmsClient',
  'apiUrl' => 'https://sms-api.example.com/v3/send',
  'accessKey' => 'ak-xxxxxx',
  'secretKey' => 'sk-xxxxxx',
  'timeout' => 8,
],

这一步不能写在params里——组件必须由Yii DI容器管理,否则无法在控制器或服务类中通过$this->sms访问。

【timeout必须设为8秒以上】国内主流短信网关(如阿里云、腾讯云、容联)在高峰时段响应常达3~6秒,设成默认5秒会导致约12%请求被误判超时。

实现SmsClient类并注入HTTP客户端

common/components/SmsClient.php中创建类:

继承\yii\base\Component,构造函数中注入\yii\httpclient\Client实例:

public function __construct(array $config = []) {
  $this->httpClient = Yii::createObject([
    'class' => 'yii\httpclient\Client',
    'transport' => 'yii\httpclient\CurlTransport',
    'requestConfig' => ['format' => \yii\httpclient\Client::FORMAT_JSON],
  ]);
  parent::__construct($config);
}

不要复用Yii::$app->httpclient——它可能已被其他模块修改了默认header或baseUri,导致短信请求头污染。

定义发送方法:public function send($phone, $templateId, $params = []),内部调用$this->httpClient->post($this->apiUrl)->setData([...])->send()

处理发送失败与重试逻辑

短信网关返回HTTP 200不等于发送成功,必须解析响应体中的code字段:

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载

第一步:检查$response->isOk,若为false则直接抛出\yii\httpclient\Exception

第二步:解码JSON响应,判断$data['code'] === 0(以阿里云为例),否则记录完整响应体到@runtime/logs/sms-error.log

第三步:对临时性错误(如code为10003“频率超限”、10004“余额不足”)做指数退避重试,最多2次,间隔1.5秒→3秒;

第四步:重试后仍失败,抛出common\exceptions\SmsSendException,该异常类需继承\yii\base\Exception且不被通用try/catch捕获。

这一步不能依赖框架的retry行为——Yii2.0.51的yii\httpclient\Client不支持自动重试,硬编码逻辑更可控。

在控制器中调用短信服务

方法一:通过$this->sms直接调用(前提是在控制器中声明public $sms;):

try {
  $this->sms->send('13800138000', 'SMS_123456789', ['code' => '1234']);
} catch (\common\exceptions\SmsSendException $e) {
  Yii::error("短信发送失败: " . $e->getMessage(), 'sms');
  throw new BadRequestHttpException('验证码发送失败,请稍后再试');
}

方法二:在Action中用依赖注入(需先在config/web.php'container'中绑定接口):

'container' => [
  'definitions' => [
    'common\interfaces\SmsInterface' => ['class' => 'common\components\SmsClient'],
  ],
],

然后控制器构造函数声明public function __construct(private SmsInterface $sms, $config = [])

注意:不要在beforeAction()里调用短信发送——它可能被缓存中间件跳过,导致验证码未发就进入主逻辑。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3028

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4249

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3649

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

366

15

PHP Yii框架专题
PHP Yii框架专题

本专题专注于PHP主流框架Yii的应用,系统讲解MVC架构、路由机制、数据库操作、表单处理、安全验证与RESTful API 开发等核心内容。通过电商网站、后台管理系统与内容管理平台等实战项目,帮助学员快速掌握Yii框架的开发技巧与实战经验。

2025.09.04

2750

22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

0

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

0

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

0

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

0

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.2万人学习