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