Laravel中簡單使用隊列加快訪問速度
- 2019 年 11 月 13 日
- 筆記
前言
- Laravel 隊列服務為各種不同的後台隊列提供了統一的 API
- 允許推遲耗時任務(例如發送郵件)的執行,從而大幅提高 web 請求速度
總而言之,隊列就是在後台執行一些耗時的任務,從而讓前台訪問速度加快。比較典型的例子就是發郵件。特別是同一時間發送多個郵件時。
程式設計師啊,就是折騰的命啊!
步驟
遷移隊列需要的表
才開始嘗試使用隊列,還是簡單點,使用資料庫就行。
修改配置文件:
在.env
文件里默認有:
QUEUE_CONNECTION=sync
,也即默認使用的是sync
驅動,我們這裡改為database
【資料庫】

運行遷移文件
php artisan queue:table

以上是隊列所需數據表
php artisan queue:failed-table

以上是隊列任務運行失敗的記錄表
多了兩張表,好了,不用管了。

執行遷移文件
php artisan migrate

編寫任務類
1、創建一個任務類
php artisan make:job SendSeo

資料庫就多了兩張表:

2、修改創建的任務類
app/Jobs/SendSeo.php
其中handle方法就是處理任務的具體邏輯操作。

public function handle() { Log::info('task executed!!!!'); }
這裡就記錄一條日誌就行
如果有額外的參數需要填寫,那麼就在構造方法裡面傳入即可。

推送隊列
我這裡建立了一個測試控制器,TestController
,裡面有個測試方法test
,Web路徑是:http://127.0.0.1/test/test
你的是多少就是多少,我們這裡就是為了觸發隊列
public function test() { $this->dispatch(new SendSeo()); }
訪問,然後看資料庫:

還沒完,還要後台監聽
php artisan queue:listen --tries=3

看樣子,成功啦。我們去日誌文件看一下:

莫問題。
然後看資料庫:

資料庫清空了,因為任務已經執行了。
解答下小白(以前的我)的問題:
1、必須要後台執行?也即php artisan queue:listen --tries=3
?
肯定的啊,都是後台的隊列了,那肯定就是後台執行啊。所以,laravel完全不適合在虛擬機裡面運行,無論從composer包的安裝還是其他方面來說。
2、在Linux中,你通過ssh後台執行 php artisan queue:listen --tries=3
需要在後面加上一個&
也即:
php artisan queue:listen --tries=3 &
為什麼?因為你不想你退出ssh,它就不後台執行了嘛?
附命令
附上一些常用命令
1、運行隊列監聽器
php artisan queue:listen
- 如果執行成功, jobs 中的數據表就沒有數據了
- 如果執行失敗,可以在日誌中查看原因, 默認是 storage/logs/laravel-xxx.log
2、處理失敗的任務
在任務失敗時, 你可以選擇 清除失敗的任務或者 重新執行失敗的任務
- 查看所有失敗的任務, 會將所有失敗的任務查詢出來輸出到命令行 php artisan queue:failed
3、重新執行失敗任務
- 重新執行指定id失敗的任務 php artisan queue:retry 1
此處的 1 失敗任務表中的任務的 id, 表示重新執行指定id失敗任務
- 重新執行所有的失敗任務 php artisan queue:retry all
4、清除失敗任務
- 清除指定id失敗的任務 php artisan queue:forget 2
此處的 2 失敗任務表中的任務的 id, 表示清除指定id失敗任務
- 清除所有失敗的任務 php artisan queue:flush