W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
應(yīng)用程序中能夠放進(jìn)隊(duì)列的工作都存放在 App\Commands 目錄下,你可以借由下面 Artisan 命令產(chǎn)生一個(gè)可使用隊(duì)列的命令:
php artisan make:command SendEmail --queued
要推送一個(gè)新的工作至隊(duì)列,請使用 Queue::push 方法:
Queue::push(new SendEmail($message));
注意: 在這個(gè)例子當(dāng)中,我們直接使用 Queue Facade,然而,常見的作法是借由 Command Bus 去分派隊(duì)列命令。我們將會(huì)在這篇文章中繼續(xù)使用 Queue Facade,不過,也要熟悉使用 command bus,因?yàn)樗軌蛲瑫r(shí)分派你的網(wǎng)站應(yīng)用程序中隊(duì)列與同步的命令。
默認(rèn)情況下,make:command Artisan 命令會(huì)產(chǎn)生一個(gè) "self-handling" 的命令,意味著命令里會(huì)包含一個(gè) handle 方法。這個(gè)方法將會(huì)在隊(duì)列執(zhí)行時(shí)被調(diào)用。你可以在 handle 方法使用時(shí)提示傳入任何你需要的依賴,而 服務(wù)容器 會(huì)自動(dòng)注入他們:
public function handle(UserRepository $users)
{
//
}
如果你希望你的命令有獨(dú)立的處理類別,你可以在使用 make:command 命令時(shí)加上 --handler 標(biāo)識。
php artisan make:command SendEmail --queued --handler
這個(gè)被產(chǎn)生出來的處理類別將會(huì)放在 App\Handlers\Commands 目錄下面,并且服務(wù)容器會(huì)自動(dòng)解析。
你也可指定隊(duì)列工作送至指定的連接:
Queue::pushOn('emails', new SendEmail($message));
如果你需要發(fā)送一樣的數(shù)據(jù)去幾個(gè)不同的隊(duì)列工作,你可以使用 Queue::bulk 方法:
Queue::bulk([new SendEmail($message), new AnotherCommand]);
有時(shí)候你可能想要延遲執(zhí)行一個(gè)隊(duì)列工作,舉例來說你希望一個(gè)隊(duì)列工作在客戶注冊 15 分鐘后才寄送 e-mail,你可以使用 Queue::later 方法來完成這件事情:
$date = Carbon::now()->addMinutes(15);
Queue::later($date, new SendEmail($message));
在這個(gè)例子中,我們使用 Carbon 日期類庫來指定我們希望隊(duì)列工作希望延遲的時(shí)間,另外你也可發(fā)送一個(gè)整數(shù)來設(shè)置你希望延遲的秒數(shù)。
注意: 在 Amazon SQS 服務(wù)中,有最大 900 秒( 15 分鐘 )的限制。
如果你隊(duì)列工作的構(gòu)造器接收一個(gè) Eloquent 模型,只有這個(gè)模型的標(biāo)記( identifier ) 會(huì)被序列化后放到隊(duì)列中。當(dāng)工作真正開始被處理的時(shí)候,隊(duì)列系統(tǒng)會(huì)自動(dòng)從數(shù)據(jù)庫中重新取得完整的模型實(shí)例。這個(gè)對你的網(wǎng)站應(yīng)用程序來說是完全透明的,并且預(yù)防一些在序列化完整 Eloquent 模型實(shí)例時(shí)可能遇到的問題。
一旦一個(gè)工作被處理過后,這個(gè)工作必須從隊(duì)列中刪除。假如在工作執(zhí)行后沒有發(fā)生錯(cuò)誤,這個(gè)將會(huì)自動(dòng)完成。
如果你希望能夠手動(dòng)刪除或著釋放工作,在 Illuminate\Queue\InteractsWithQueue trait 中提供 release 以及 delete 方法的接口。其中 release 方法接受單一一個(gè)值:你想要等待工作再次能夠執(zhí)行的秒數(shù)。
public function handle(SendEmail $command)
{
if (true)
{
$this->release(30);
}
}
假如在工作執(zhí)行后發(fā)生錯(cuò)誤,這個(gè)工作將會(huì)自動(dòng)被釋放回到隊(duì)列之中,如此一來便能夠再次嘗試執(zhí)行工作。工作會(huì)一直被釋放回隊(duì)列直到到達(dá)應(yīng)用程序的嘗試上限。這個(gè)上限數(shù)值可以在使用 queue:listen 或 queue:work Artisan 命令時(shí)候借由 --tries 開關(guān)來設(shè)置。
當(dāng)一個(gè)工作執(zhí)行后發(fā)生錯(cuò)誤,這個(gè)工作將會(huì)自動(dòng)的釋放回隊(duì)列當(dāng)中,你可以透過 attempts 方法來檢查這個(gè)工作已經(jīng)被執(zhí)行的次數(shù):
if ($this->attempts() > 3)
{
//
}
注意: 你的命令處理類別必須使用 Illuminate\Queue\InteractsWithQueue 這個(gè) trait 才能夠使用這個(gè)方法。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: