本文總結來自 Web開發實戰進階:使用佇列
什麼時候使用佇列
處理一個需求中,屬於最佳化而非必須的功能時,可以使用佇列來完成。
佇列允許你非同步執行消耗時間的任務,這樣可以有效降低請求響應的時間。
1. 配置佇列
佇列的配置資訊儲存在 config/queue.php
中。
佇列的驅動包括:資料庫、Beanstalkd、Amazon SQS、Redis 和同步(本地使用)的驅動。宣告為 null
時表示不使用佇列任務。
本次教程中,使用 Redis 作為佇列驅動,需要先安裝相關依賴:
$ composer require "predis/predis:~1.0"
然後修改 .env
檔案中的環境變數 QUEUE_DRIVER
的值為 redis
失敗任務
佇列任務執行失敗後,會進行重試,當重試次數超過指定的任務重試最大次數後,會將失敗的任務資訊寫入 failed_jobs
表中。使用 php artisan queue:failed-table
指令來建立 failed_jobs
表的遷移檔案,隨後執行遷移。
$ php artisan queue:failed-table
$ php artisan migrate
2. 生成任務類
使用 make:job
Artisan 指令來建立一個新的佇列任務,該指令會在 app/Jobs
下生成一個新的類
$ php artisan make:job JobName
該類會實現 Illuminate\Contracts\Queue\ShouldQueue
介面,該介面表明 Laravel 應該將任務新增到後臺的任務佇列中,而非同步執行。
引入 SerializesModels
trait, Eloquent 模型會被優雅的序列化和反序列化。construct
將會序列化模型ID,執行任務時,會從資料庫中根據 ID 檢索出模型例項。handle
方法將在任務執行時被呼叫。且為了避免出現模型監控器的死迴圈,我們要使用 DB
類直接對資料庫進行操作。
3. 任務分發
使用 dispatch
方法,可以將任務推送到佇列。
4. 佇列監控 Horizon
Horizon 是 Laravel 生態圈裡的一員,為 Laravel Redis 佇列提供了一個漂亮的儀表板,允許我們很方便地檢視和管理 Redis 佇列任務執行的情況。
使用 composer 安裝:
$ composer require "laravel/horizon:~1.0"
安裝完成後,使用 vendor:publish
Artisan 命令釋出配置檔案 config/horizon.php
和存放在 public/vendor/horizon
資料夾中的CSS、JS 等頁面資原始檔。
$ php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
使用指令 php artisan horizon
即可監控佇列任務的執行,瀏覽器中開啟 http://larabbs.test/horizon 即可透過視覺化介面監控佇列任務的狀態。
線上部署
在生產環境使用佇列需要注意以下兩個問題:
-
使用 Supervisor 程式工具進行監控
php artisan horizon
指令的執行,以便程式意外退出時能自動重啟,配置和使用參照 Horizon文件 -
每一次部署程式碼時,需先執行 artisan horizon:terminate 然後再執行 artisan horizon 重新載入程式碼。
本作品採用《CC 協議》,轉載必須註明作者和本文連結