欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

thinkphp延时队列/自动取消订单/php自动操作

时间:2023-07-12
延时队列介绍:

什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。

使用场景

延时队列在项目中的应用还是比较多的,尤其像电商类平台订单成功后,在30分钟内没有支付,自动取消订单
外卖平台发送订餐通知,下单成功后60s给用户推送短信。
如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存
淘宝新建商户一个月内还没上传商品信息,将冻结商铺等
……
上边的这些场景都可以应用延时队列解决。

php使用方法

首先安装queue

composer require topthink/think-queue

如果安装失败需要注意安装版本的问题:

composer create-project topthink/think tp5 5.0.*

获取版本后安装指定版本

composer require topthink/think-queue 1.1.4

代码实现功能

1,首先搭建消息队列的存储环境
推荐redis储存环境
可自行在宝塔环境搭建redis服务
2,配置驱动环境

打开项目configqueue.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,创建队列和推送
新增 applicationindexcontrollerJobTest.php 控制器,在该控制器中添加 fire 方法
fire方法是消息队列默认调用的方法

<?phpnamespace appjob;use thinkfacadeLog;use thinkqueueJob;use appcommonmodelJob 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 appindexhome;use thinkqueueJob;use thinkfacadeLog;use thinkQueue;class Tasks{public static function onAfterInsert($shopid) { //要执行的功能放到延时队列里 20秒后自动执行 Queue::later(20, 'appjobTest', ['name'=>$shopid], 'Test');// //参数1:时间,,参数2:路径,参数3:业务参数,参数4:队列名称 } }

处理任务
打开命令行切换项目目录输入命令启动任务

php think queue:work --daemon --queue Test

配合supervisor使用,保证进程常驻
宝塔安装supervisor添加守护进程

启动后查看日志

延时队列到此结束

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。