1、简介
队列服务为各种不同的后台队列提供了统一的API。队列允许你推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度。
1.1 配置
.env文件的QUEUE_DRIVER选项决定应用使用的队列“驱动”。(这使用数据库)
.env文件选项 QUEUE_DRIVER=database
1.2 队列驱动预备知识
为了使用database
队列驱动,需要一张数据库表来存放任务,要生成创建该表的迁移,运行Artisan命令queue:table
,迁移被创建好了之后,使用migrate
命令运行迁移:
php artisan queue:table
php artisan migrate
2、编写任务类
1. 生成任务类
默认情况下,应用的所有队列任务都存放在app/Jobs目录。
php artisan make:job SendReminderEmail
2.1 任务类结构
默认情况下,应用的所有队列任务都存放在app/Jobs
目录。任务类非常简单,正常情况下只包含一个当队列处理该任务时被执行的handle
方法,让我们看一个任务类的例子:
<?php
namespace App\Jobs;
use App\User;
use App\Jobs\Job;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $user;
/**
* 创建一个新的任务实例
*
* @param User $user
* @return void
*/
public function __construct()
{
}
/**
* 执行任务
*
* @param Mailer $mailer
* @return void
*/
public function handle()
{
DB::table('comments')->insert(['name'=>'测试任务']);
}
推送任务到队列
1. 控制器中
因为Laravel app/Http/Controllers/Controller.php 使用了DispatchesJobs trait。该trait提供了一些允许你方便推送任务到队列的方法,例如dispatch方法:
// 表示一分钟后执行任务
$job = (new SendJob())->delay(60);
$this->dispatch($job);
Artisan控制台运行如下命令
php artisan queue:listen(测试可以)
或者php artisan queue:work(官方建议)
使用--tries开关来指定任务最大可尝试执行次数
php artisan queue:listen --tries=3
处理失败的任务
任务执行次数达到最大限制后,会被插入到failed_jobs表,失败任务的名字可以通过配置文件config/queue.php来配置。
1. 迁移记录失败队列需要的数据表
php artisan queue:failed-table
php artisan migrate
2. 重试失败任务
要查看已插入到failed_jobs数据表中的所有失败任务,该命令将会列出任务ID,连接,对列和失败时间。
php artisan queue:failed
任务ID可用于重试失败任务,例如,要重试一个ID为5的失败任务,要用到下面的命令:
php artisan queue:retry 5
要重试所有失败任务,使用如下命令即可:
php artisan queue:retry all
如果你要删除一个失败任务,可以使用queue:forget命令:
php artisan queue:forget 5
要删除所有失败任务,可以使用queue:flush命令:
php artisan queue:flush