1:安装redis
2:安装think-queue
composer require topthink/think-queue
3:设置配置文件,使用redis进行存储,文件位置config/queue.php
return [
'default' => 'redis',
'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目录下新建queue文件夹,文件夹下新建Order.php处理类
//订单超时取消
public function overdue(Job $job,$order_no){
$order = OrderModel::get($order_no,1); //校验当前订单是否为待支付状态
if($order->isEmpty()){
$job->delete(); //非待支付状态,删除执行
} else {
$result = OrderModel::overtime($order_no); //更新订单状态为已过期
if($result){
$job->delete(); //更新过期成功,删除执行
} else {
if ($job->attempts() > 3) {
$job->delete(); //累计执行3次均失败,删除执行
}else{
$job->release(10); //间隔10秒执行一次
}
}
}
}
5:订单生成成功后调用延时队列
use think\facade\Queue;
public static function createOrder(){
$order = ...//执行订单生成存储
Queue::later(30 * 60,'app\queue\Order@overdue',$order['order_no']); //加入队列,并延迟30分钟执行
}
6:生成订单后查看redis队列是否存在新订单数据
7:到期执行订单状态修改
8:宝塔环境添加进程守护
安装supervisord管理器
添加进程守护管理