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