延时队列介绍:
什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。
使用场景
延时队列在项目中的应用还是比较多的,尤其像电商类平台订单成功后,在30分钟内没有支付,自动取消订单
外卖平台发送订餐通知,下单成功后60s给用户推送短信。
如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存
淘宝新建商户一个月内还没上传商品信息,将冻结商铺等
……
上边的这些场景都可以应用延时队列解决。
php使用方法
首先安装queue
composer require topthink/think-queue
如果安装失败需要注意安装版本的问题:
composer create-project topthink/think tp5 5.0.*
获取版本后安装指定版本
composer require topthink/think-queue1.1.4
代码实现功能
1,首先搭建消息队列的存储环境
推荐redis储存环境
可自行在宝塔环境搭建redis服务
2,配置驱动环境
打开项目\config\queue.php 进行配置
<?phpreturn ['connector' => 'Redis',// Redis 驱动'expire' => 60,// 任务的过期时间,默认为60秒; 若要禁用,则设置为 null'default' => 'default',// 默认的队列名称'host' => '127.0.0.1',// redis 主机ip'port' => 6379,// redis 端口'password' => '',// redis 密码'select' => 0,// 使用哪一个 db,默认为 db0'timeout' => 0,// redis连接的超时时间'persistent' => false,// 是否是长连接];
3,创建队列和推送
新增 \application\index\controller\JobTest.php 控制器,在该控制器中添加 fire 方法
fire方法是消息队列默认调用的方法
<?phpnamespace app\job;use think\facade\Log;use think\queue\Job;use app\common\model\Job as JobData;class Test{public function fire(Job $job, $data){if ($job->attempts() > 2) {echo 1;Log::write('Test执行失败了');$job->delete();} else {//可在里边执行具体增删改查$data = ['rand'=>$data['name'],'create_time'=>date('Y-m-d H:i:s')];JobData::insert($data);$job->delete();}}}
在项目中进行调用延时队列方法
<?php//创建namespace app\index\home;use think\queue\Job;use think\facade\Log;use think\Queue;class Tasks{public static function onAfterInsert($shopid){//要执行的功能放到延时队列里 20秒后自动执行Queue::later(20, 'app\job\Test', ['name'=>$shopid], 'Test');// //参数1:时间,,参数2:路径,参数3:业务参数,参数4:队列名称} }
处理任务
打开命令行切换项目目录输入命令启动任务
php think queue:work --daemon --queue Test
配合supervisor使用,保证进程常驻
宝塔安装supervisor添加守护进程
启动后查看日志