Laravel 隊列

Laravel 11 框架具有多種用於開發乾淨且高級軟體的功能和工具,包括 Laravel 隊列

Le 隊列 它們允許我們安排耗時的任務(例如發送電子郵件或產生報告)在後台處理,從而釋放您的應用程式來處理其他請求。

在本文中,我們討論如何設定和使用 Laravel 佇列,並提供一些範例來說明其實際用途。

預計閱讀時間: 5 minuti

配置佇列驅動程式

Laravel 支援多種佇列驅動程序,包括 Redis, Amazon SQS e Beanstalkd。您可以根據您的特定要求和環境為您的應用程式選擇合適的驅動程式。

要配置佇列驅動程序,請轉到文件 .env 在 Laravel 應用程式的根目錄中並設定變數 QUEUE_CONNECTION 在您要使用的驅動程式上:

QUEUE_CONNECTION=redis

創建類別 Job

接下來,您需要建立一個類 Job 代表您要處理的任務。這 Job 透過擴展介面來實現類別 Illuminate\Contracts\Queue\ShouldQueue,表示該作業可以加入到佇列中。

例如,讓我們建立一個向使用者發送電子郵件的作業:

php artisan make:job SendEmailJob

這將在目錄中建立一個新的工作類 app/Jobs。您可以在方法中定義作業的邏輯 handle:

<?php

命名空間 App\Jobs;

使用App\Models\Podcast;
使用應用程式\服務\音訊處理器;
使用 Illuminate\Bus\Queueable;
使用 Illuminate\Contracts\Queue\ShouldQueue;
使用 Illuminate\Foundation\Bus\Dispatchable;
使用 Illuminate\Queue\InteractsWithQueue;
使用 Illuminate\Queue\SerializesModels;

SendEmailJob 類別實作 ShouldQueue
{
使用 Dispatchable、InteractsWithQueue、Queueable、SerializesModels;

受保護的$用戶;

/ **
* 建立一個新的作業實例。
*/
公用函數 __construct(使用者 $user)
{
$這個->用戶= $用戶;
}

/ **
* 執行作業。
*/
公用函數句柄()
{
郵件::發送($this->用戶->電子郵件)->發送(new \App\Mail\WelcomeEmail($this->用戶));
}
}

在這個例子中,我們可以看到我們傳遞了一個 雄辯模型 直接在構造函數中 Job in queue。 謝謝 SerializesModels 被使用過 Job, 模型 Eloquent 並且相關的載入關係將在處理過程中被序列化 Job.

這意味著如果 Job 隊列中接受一個模型 雄辯 在其建構函式中,只有模型標識符會被序列化到 queue。當。 job 實際上是管理的,系統 queue 將自動檢索從載入的完整模型實例及其關係 數據庫。這種模型序列化方法允許您發送 payload di job 比駕駛員的小得多 queue.

將作業分派到 Laravel 佇列

定義類別後 job,我們可以將其發送至 queue 使用方法 dispatch。例如,讓我們做 dispatch 德爾 Job SendEmailJob,提供對象 $user 作為參數:

$user = 使用者::find(1);
調度(新的SendEmailJob($使用者));

或者,我們可以使用該方法 dispatchNow 立即運行作業而不將其新增至佇列:

dispatch_now(new SendEmailJob($user));

調度作業有不同的方法或條件,要了解有關這些方法的使用的更多信息,我建議您閱讀文檔 Laravel 11 點這裡。 特別是:

的過程 queue Laravel 的

來處理 job in queue,你需要開始一個 worker queue。為此,Laravel 提供了命令 php artisan queue:work,它執行 worker 誰不斷質疑 queue 並處理 job 當它們變得可用時。

php工匠隊列:工作

您也可以指定名稱 queue 以及使用選項的工作執行緒數 --queuee --tries:

php artisan 隊列:工作 --queue=emails --tries=3

將執行A worker 它處理 job 通過 queue emails 並重試失敗的作業最多 3 次。

Monitor queue

您可以監控以下狀態 job 使用包包排隊 Laravel Horizon,它提供了一個儀表板,顯示有關 worker in queuejob 繼續 job 不成功。

安裝和配置 Laravel Horizon,執行以下命令:

作曲家需要 laravel/horizo​​n

工作重疊管理

Laravel 包含有助於避免作業重疊的中間件: Illuminate\Queue\Middleware\WithoutOverlapping。例如,假設佇列中的作業修改了應該以獨佔方式修改的資源。

例如信用、餘額等……。也就是說,資訊在更新時不能被其他行程同時更新。

為此,我們可以返回該方法 WithoutOverlapping 從工作方法 middleware:

use Illuminate\Queue\Middleware\WithoutOverlapping;
 
/**
 * Get the middleware the job should pass through.
 *
 * @return array<int, object>
 */
public function middleware(): array
{
    return [new WithoutOverlapping($this->user->id)];
}

任何相同類型的重疊作業都會釋放回佇列中。您也可以指定在重新嘗試執行已發佈作業之前必須經過的秒數:

public function middleware(): array
{
    return [(new WithoutOverlapping($this->order->id))->releaseAfter(60)];
}

如果您想立即刪除任何重疊的作業以免重試,您可以使用以下方法 dontRelease:

public function middleware(): array
{
    return [(new WithoutOverlapping($this->order->id))->dontRelease()];
}

中介軟體 WithoutOverlapping 它由 Laravel 的原子塊功能提供支援。有時,作業可能會意外失敗或過期,導致鎖定未被釋放。因此,您可以使用以下方法明確定義鎖定到期日 expireAfter。例如,下面的範例將指示 Laravel 釋放鎖 WithoutOverlapping 作業開始處理後三分鐘:

public function middleware(): array
{
    return [(new WithoutOverlapping($this->order->id))->expireAfter(180)];
}

Le 隊列 Laravel 它們提供了一種強大的方法來在背景處理耗時的任務,使您的應用程式能夠有效地處理其他請求。透過遵循本文中描述的步驟,您可以輕鬆設定和使用 Laravel 隊列 在您的應用程式中。能夠使用以下方式監視和管理佇列 Laravel 地平線,您可以確保您的應用程式平穩且有效率地運行。使用 Laravel 隊列,您可以為客戶提供更好的用戶體驗並提高應用程式的整體效能。

相關閱讀

Ercole Palmeri

作者