php笔记之-队列
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
(转载请注明花儿为何那样红博客)