延时队列介绍:
什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。
使用场景
延时队列在项目中的应用还是比较多的,尤其像电商类平台订单成功后,在30分钟内没有支付,自动取消订单
外卖平台发送订餐通知,下单成功后60s给用户推送短信。
如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存
淘宝新建商户一个月内还没上传商品信息,将冻结商铺等
……
上边的这些场景都可以应用延时队列解决。
think-queue使用方法
1.安装think-queue
composer require topthink/think-queue
2.安装redis
1)打印phpinfo(),查看是否已安装redis,并开启服务。没有请自行百度安装redis
phpinfo()
3.配置,项目\config\queue.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
return [
'default' => 'redis',
'connector' => 'sync',
'connections' => [
'sync' => [
'type' => 'sync',
],
'database' => [
'type' => 'database',
'queue' => 'default',
'table' => 'jobs',
'connection' => null,
],
'redis' => [
'type' => 'redis',
'queue' => 'default',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'persistent' => false,
],
],
'failed' => [
'type' => 'none',
'table' => 'failed_jobs',
],
];
4.创建队列和推送
新增 \app\job\test.php 控制器,在该控制器中添加 fire 方法
fire方法是消息队列默认调用的方法
<?php
declare (strict_types = 1);
namespace app\job;
use think\queue\Job;
use think\facade\Db;
class test{
/**
* 报表
*/
public function fire(Job $job, $data){
$isJobDone = $this->doTask($data);
if ($isJobDone) {
$job->delete();
}else{
$job->release(2);
}
}
/**
*
* task具体执行逻辑
*/
public function doTask($data){
$params = [
'name'=>$data['name'],
'type'=>1,
'sort'=>1
];
$res = Db::table('chd_auth_role')->insert($params);
if ($res){
return true;
}else{
return false;
}
}
}
5.在项目中进行调用延时队列方法
<?php
namespace app\controller;
use app\BaseController;
use think\facade\Queue;
use think\facade\Db;
class Index extends BaseController
{
public function index()
{
$jobHandlerName = 'app\job\test';
$jobQueueName = "testTask";
//Queue::push($jobHandlerName, ['name'=>"5255"], $jobQueueName);
Queue::later('10',$jobHandlerName,['name'=>"52556"],$jobQueueName);
echo '加入队列成功';
}
}
6.添加监听 - 重要必要有这个监听,Queue::later才有效
php think queue:listen --queue testTask
图片.png