异步队列:可以大幅度缩短 Web 请求和响应的时间。
注意:本地安装配置redis扩展,且已经启动redis
1、创建队列任务:
php artisan make:job CloseOrder
2、CloseOrder.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 App\Services\Facades\Api\Order\OrderService;
class CloseOrder implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $order;//订单信息
public function __construct($order, $delay)
{
$this->order = $order;
// 设置延迟的时间,delay() 方法的参数代表多少秒之后执行
$this->delay($delay);
}
// 当队列处理器从队列中取出任务时,会调用 handle() 方法
public function handle()
{
// 判断对应的订单是否已经被支付
// 如果已经支付则不需要关闭订单,直接退出
if ($this->order['order_status']!=1) {
return;
}
//处理业务逻辑,更改订单状态,更新商品库存等
//处理失败异常抛出
throw new \Exception('取消订单失败:单号:'.$this->order['order_no']);
}
}
3、队列调用:
use App\Jobs\CloseOrder;
dispatch(new CloseOrder($orderData, 30 * 60));//30分钟后自动取消订单
4、更改异步驱动:
在laravel生成的.env文件中将队列驱动由同步sync改为redis
QUEUE_CONNECTION=redis
5、安装predis/predis包
使用redis异步驱动,需要安装predis/predis包
composer require predis/predis
6、启动队列
php artisan queue:work
调用方法:
dispatch_now(new CloseOrder($orderData));//立即异步执行方法
dispatch(new CloseOrder($orderData, 30 * 60));//延迟30分钟后执行方法
失败任务处理:
将失败的任务记录到数据库,命令如下:
php artisan queue:failed-table
php artisan migrate
设置最大尝试次数:
php artisan queue:work redis --tries=3
任务失败后,将最大执行3次,3次后失败任务记录到数据库中、
重新尝试失败任务:
查看失败任务:
php artisan queue:failed
执行命令后将会列出任务 ID ,队列,以及失败的时间。
尝试单个任务:php artisan queue:retry 任务ID
尝试所有失败任务:php artisan queue:retry all
删除失败任务:
删除单个失败任务:php artisan queue:forget 任务ID
删除所有失败任务:php artisan queue:flush
监听任务队列:
php artisan queue:listen
启动队列守护进程:
安装Supervisor