laravel延时任务

可以使用Laravel框架中的队列机制来实现用户下单后3分钟未支付自动取消订单的功能。具体步骤如下:

  1. 创建一个取消订单任务类:
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;

class CancelOrder implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $orderId;

    public function __construct($orderId)
    {
        $this->orderId = $orderId;
    }

    public function handle()
    {
        // 更新订单状态为取消
        DB::table('orders')
            ->where('id', $this->orderId)
            ->where('status', 'unpaid')
            ->update(['status' => 'cancelled']);
    }
}
  1. 订单创建后添加取消订单任务到队列中:
use App\Jobs\CancelOrder;
use Illuminate\Support\Facades\Queue;

// 创建订单代码省略

$order = Order::create($orderData); // 创建订单

$cancelJob = (new CancelOrder($order->id))->delay(now()->addMinutes(3));
Queue::push($cancelJob);

上述代码中,通过delay()方法设置任务执行时间为当前时间 +3分钟。

  1. 启动队列处理器监听任务:
php artisan queue:work

这样,当订单创建后,将会添加一个延时任务,队列会依次执行在时间上已经到达的任务,所以在订单创建之后3分钟,队列就会执行取消订单任务。

  1. 配置.env文件:

开启队列监听:

QUEUE_CONNECTION=database

说明:在这种情况下,我们使用Laravel中的数据库队列驱动程序,所以需要确保您已经运行了迁移并将队列驱动程序设置为“数据库”。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容