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分钟,自动更改到取消状态