一、簡(jiǎn)介
Laravel 隊(duì)列組件提供一個(gè)統(tǒng)一的 API 集成了許多不同的隊(duì)列服務(wù),隊(duì)列允許你延后執(zhí)行一個(gè)耗時(shí)的任務(wù),例如延后至指定的時(shí)間才發(fā)送郵件,進(jìn)而大幅的加快了應(yīng)用程序處理請(qǐng)求的速度。
由于本例子用到郵件功能,不了解的童鞋請(qǐng)移步(Laravel 5.2 教程 - 郵件)。
二、配置
1. 配置文件
隊(duì)列配置文件存放在config/queue.php。在該文件中你將會(huì)找到框架自帶的每一個(gè)隊(duì)列驅(qū)動(dòng)的連接配置,包括數(shù)據(jù)庫(kù)、Beanstalkd、 IronMQ、 Amazon SQS、 Redis以及同步(本地使用)驅(qū)動(dòng)。其中還包含了一個(gè)null隊(duì)列驅(qū)動(dòng)以拒絕隊(duì)列任務(wù)。
.env 配置默認(rèn)是同步sync 本文章演示使用database方式
2. 遷移隊(duì)列需要的數(shù)據(jù)表
php artisan queue:table
php artisan migrate
三、編寫任務(wù)類
1. 生成任務(wù)類
默認(rèn)情況下,應(yīng)用的所有隊(duì)列任務(wù)都存放在app/Jobs目錄。
php artisan make:job SendReminderEmail
該命令將會(huì)在app/Jobs目錄下生成一個(gè)新的類,并且該類實(shí)現(xiàn)了Illuminate\Contracts\Queue\ShouldQueue接口,告訴Laravel該任務(wù)應(yīng)該被推送到隊(duì)列而不是同步運(yùn)行。
2. 編寫任務(wù)類
下面是一個(gè)通過隊(duì)列發(fā)送郵件的簡(jiǎn)單例子:
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Mail;
class SendReminderEmail extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $email;
/**
* 創(chuàng)建一個(gè)新的任務(wù)實(shí)例
*
* @param $email
*/
public function __construct($email)
{
$this->email = $email;
}
/**
* 執(zhí)行任務(wù)
*
* @return void
*/
public function handle()
{
// 發(fā)送郵件
Mail::raw('Queue test', function($message) {
$message->subject('測(cè)試郵件,勿回');
$message->to($this->email);
});
}
}
四、推送任務(wù)到隊(duì)列
1. 控制器中
因?yàn)長(zhǎng)aravel app/Http/Controllers/Controller.php 使用了DispatchesJobs trait。該trait提供了一些允許你方便推送任務(wù)到隊(duì)列的方法,例如dispatch方法:
$this->dispatch(new SendReminderEmail('849291170@qq.com'));
2. DispatchesJobs trait
如果你想在路由或控制器之外的某些地方分發(fā)任務(wù),可以使用DispatchesJobs trait 在任何地方將任務(wù)添加到隊(duì)列。下面是在模型中使用的例子:
<?php
namespace App;
use App\Jobs\SendReminderEmail;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Bus\DispatchesJobs;
class Student extends Model
{
use DispatchesJobs;
public static function queue()
{
dispatch(new SendReminderEmail('849291170@qq.com'));
}
}
3. 延遲執(zhí)行
下面是延遲60秒執(zhí)行的例子:
$job = (new SendReminderEmail('849291170@qq.com'))->delay(60);
$this->dispatch($job);
五、運(yùn)行隊(duì)列監(jiān)聽器
Artisan控制臺(tái)運(yùn)行如下命令
php artisan queue:listen
使用--tries開關(guān)來指定任務(wù)最大可嘗試執(zhí)行次數(shù)
php artisan queue:listen --tries=3
六、處理失敗的任務(wù)
任務(wù)執(zhí)行次數(shù)達(dá)到最大限制后,會(huì)被插入到failed_jobs表,失敗任務(wù)的名字可以通過配置文件config/queue.php來配置。
1. 遷移記錄失敗隊(duì)列需要的數(shù)據(jù)表
php artisan queue:failed-table
php artisan migrate
2. 重試失敗任務(wù)
要查看已插入到failed_jobs數(shù)據(jù)表中的所有失敗任務(wù),該命令將會(huì)列出任務(wù)ID,連接,對(duì)列和失敗時(shí)間。
php artisan queue:failed
任務(wù)ID可用于重試失敗任務(wù),例如,要重試一個(gè)ID為5的失敗任務(wù),要用到下面的命令:
php artisan queue:retry 5
要重試所有失敗任務(wù),使用如下命令即可:
php artisan queue:retry all
如果你要?jiǎng)h除一個(gè)失敗任務(wù),可以使用queue:forget命令:
php artisan queue:forget 5
要?jiǎng)h除所有失敗任務(wù),可以使用queue:flush命令:
php artisan queue:flush