laravel 延时队列 处理订单状态 朱雀 2021-10-23 08:17 551阅读 0赞 场景:订单下单成功之后 半小时之后如果没有付款 那么就把订单状态改为取消状态 可以使用laravel 的延时队列 修改 config/queue.php 'default' => env('QUEUE_CONNECTION', 'redis'), 使用redis的 有序集合 php artisan make:job DelayOrder 创建一个延时队列 就会在 app/Jobs目录下生成一个 DelayOrder.php 文件 <?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Support\Facades\DB; class DelayOrder implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $id=''; protected $redis=''; protected $key = 'order_list'; /** * Create a new job instance. * * @return void */ public function __construct($id) { $this->id = $id; $this->delay(300); } /** * Execute the job. * * @return void */ public function handle() { // $results = DB::select('select * from orders where id = :id', [$this->id]); if($results[0]->status == 1){ $affected = DB::update('update orders set status = 0 where id = ?', [$this->id]); if($affected){ var_dump('success'); } }else{ return; } } } handle 方法 就是 设置时间后 如果到时间了 就会执行这个方法 改方法中可以写逻辑 那么如果调用这个延时队列呢 可以创建一个OrderController <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Tymon\JWTAuth\Facades\JWTAuth; use Illuminate\Support\Facades\DB; use App\Jobs\DelayOrder; class OrderController extends Controller { protected $redis = ''; protected $key = 'order_list'; /** * Show the application dashboard. * * @return \Illuminate\Contracts\Support\Renderable */ public function index() { $order_no = time(); $goods_id = rand(); $order = DB::insert('insert into orders ( order_no,goods_id) values (?, ?)', [$order_no, $goods_id]); $id = DB::getPdo()->lastInsertId(); if($id){ // 半小时之后 不付款 取消订单状态加入延时队列 $this->dispatch(new DelayOrder($id)); }else{ } } } 在方法中 $this->dispatch 来分发这个job
还没有评论,来说两句吧...