Yii2.0.48通过yii-queue扩展实现异步解耦,需安装包、双端配置bootstrap、选用DB驱动并建表,定义Job类封装短信发送逻辑,控制器推送任务后立即响应,最后用php yii queue/listen启动消费者。

当用户提交订单后需要同步扣库存、发短信、写日志、触发站内信,但又不想让这些操作拖慢页面响应,就必须把它们从主请求流程里剥离开——Yii2.0.48自带的yii-queue扩展正好能完成这个解耦任务。
安装并启用队列扩展
执行命令安装核心队列包:composer require yiisoft/yii2-queue。
在 config/console.php 和 config/web.php 的 bootstrap 数组中都加入 'queue',确保控制台和Web端都能识别该组件。
【必须同时配置两个文件】 否则Web端推送任务会失败,而控制台无法消费任务,队列直接卡死。
选择驱动并创建队列表
推荐使用数据库驱动,兼容性好、无需额外服务依赖。在 config/console.php 中添加组件配置:
'queue' => [ 'class' => \yii\queue\db\Queue::class, 'db' => 'db', 'tableName' => '{{%queue}}', 'channel' => 'default', 'mutex' => \yii\mutex\MysqlMutex::class ]
运行迁移命令生成队列表:php yii migrate --migrationPath=@yii/queue/migrations/db。
如果迁移报错提示表已存在,说明你之前手动建过表——请确认字段是否完整包含 reserved_at、attempt、done_at 等关键列,缺一不可。
定义异步任务类
在 common/jobs 目录下新建 SmsNotifyJob.php:
namespace common\jobs; use yii\base\BaseObject; use yii\queue\JobInterface; class SmsNotifyJob extends BaseObject implements JobInterface { public $phone; public $content; public function execute($queue) { // 这里调用短信SDK发送,不阻塞主流程 \Yii::$app->sms->send($this->phone, $this->content); } }
注意:不要在 execute() 里调用 $this->user->save() 这类ActiveRecord操作——序列化时会丢失DB连接上下文,导致任务失败。
从控制器触发异步任务
第一步:在订单创建成功后,组装原始数据数组,而非传递模型实例:
$data = ['phone' => $order->user->phone, 'content' => "订单{$order->sn}已支付"];
第二步:调用队列推送接口:
Yii::$app->queue->push(new \common\jobs\SmsNotifyJob($data));
第三步:立刻返回成功响应给前端,不等待短信结果。
启动消费者监听器
在服务器后台执行常驻进程:
php yii queue/listen
若需限制单次处理数量(防止内存溢出),加参数:php yii queue/listen --max=10。
生产环境务必用 supervisor 或 systemd 托管该进程,否则终端关闭后监听立即终止。


















