W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
任務(wù)中間件允許你圍繞排隊(duì)任務(wù)的執(zhí)行封裝自定義邏輯,從而減少了任務(wù)本身的樣板代碼。例如,看下面的 handle
方法,它利用了 Laravel 的 Redis 速率限制特性,允許每 5 秒只處理一個(gè)任務(wù):
/**
* 執(zhí)行任務(wù)
*
* @return void
*/
public function handle()
{
Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
info('獲取鎖 ...');
// 處理任務(wù) ...
}, function () {
// 無法獲取鎖 ...
return $this->release(5);
});
}
雖然這段代碼是有效的, 但是 handle
方法的結(jié)構(gòu)卻變得雜亂,因?yàn)樗鼡诫s了 Redis 速率限制邏輯。此外,其他任務(wù)需要使用速率限制的時(shí)候,只能將限制邏輯復(fù)制一次。
我們可以定義一個(gè)處理速率限制的任務(wù)中間件,而不是在 handle
方法中定義速率限制。Laravel 沒有任務(wù)中間件的默認(rèn)位置,所以你可以將任務(wù)中間件放置在你喜歡的任何位置。在本例中,我們將把中間件放在 app/Jobs/Middleware
目錄:
<?php
namespace App\Jobs\Middleware;
use Illuminate\Support\Facades\Redis;
class RateLimited
{
/**
* 讓隊(duì)列任務(wù)慢慢執(zhí)行
*
* @param mixed $job
* @param callable $next
* @return mixed
*/
public function handle($job, $next)
{
Redis::throttle('key')
->block(0)->allow(1)->every(5)
->then(function () use ($job, $next) {
// 獲取鎖 ...
$next($job);
}, function () use ($job) {
// 無法獲取鎖 ...
$job->release(5);
});
}
}
正如你看到的,類似于 路由中間件,任務(wù)中間件接收一個(gè)被生成的任務(wù)以及一個(gè)為了任務(wù)被繼續(xù)進(jìn)行而需要被注入的回調(diào)。
在任務(wù)中間件被創(chuàng)建以后,他們可能被關(guān)聯(lián)到通過從任務(wù)的 middleware
方法返回的任務(wù)。這個(gè)方法并不存在于 make:job
Artisan 命令搭建的任務(wù)中,所以你需要將它添加到你自己的任務(wù)類的定義中:
use App\Jobs\Middleware\RateLimited;
/**
* 獲取一個(gè)可以被傳遞通過的中間件任務(wù)
*
* @return array
*/
public function middleware()
{
return [new RateLimited];
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: