[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
1.准备工作
1.1 创建 thinkphp5.1.40 项目
composer create-project topthink/think=5.1.40 orderService
1.2 安装消息队列依赖
composer require topthink/think-queue 2.0.4
注意:如果是TP6版本要去掉后面的版本号,TP5.1只能安装上面的包
1.3 依赖安装好以后会在config目录下生成queue.php的配置文件,直接修改配置文件如下
return [
'connector' => 'redis',
'REDIS_CLIENT' => 'predis',
'REDIS_HOST' => '127.0.0.1',
];
1.4 由于配置文件内配置了 predis,所以需要安装predis
composer require predis/predis
要注意的是PHP环境必须要事先安装redis扩展,具体安装过程这里不做赘述
2.开始开发
2.1 创建任务: application/job/CloseOrder.php,在文件内添加代码
namespace app\job;
use app\common\model\Orders;
use think\queue\Job;
class CloseOrder
{
public function fire(Job $job, $data)
{
// 查询订单信息
$order = Orders::get($data);
// 如果处于没有处于待支付状态则返回
if ($order['state'] != 2) {
$job->delete();
return;
}
// 更新订单状态为已取消
$order->state = 1;
$result = $order->save();
if($result!==false){
// 如果执行成功则删除任务
$job->delete();
}else{
// 重复3次都没结束则强制删除任务
if ($job->attempts() > 3) {
$job->delete();
return;
}else{
// 延迟10秒钟再执行一次这个任务
$job->release(10);
}
}
}
public function failed($data)
{
// ...任务达到最大重试次数后,失败了
}
}
Orders为订单表的模型文件,用于操作订单表
2.2 触发任务
当事务提交成功后,执行任务处理器。在生成订单的控制器内添加如下代码
use think\Db;
use think\Queue;
.
.
.
.
// 提交事务
DB::commit();
// 30 * 60为 30分钟的秒数
// $oid为创建成功的订单ID
Queue::later(30*60,CloseOrder::class,$oid);
关于Queue的参数请参考消息队列的文档,已经解释得很清楚了
2.3 监听并执行任务
在项目根目录运行终端代码
php think queue:listen
php think queue:work
可配合supervisor使用,保证进程常驻
3 测试
前台提交订单不支付,等待30分钟,自动更改到取消状态