作者:不洗碗工作室 - hanxiao
版權歸作者所有,轉載請註明出處
為什麼要使用佇列?
- 學個框架如果只會寫普通業務也太low了,我們要嘗試一些高階的玩法(๑•̀ㅂ•́)و✧!
- CSDN上的一篇有關訊息佇列的文章會給你很多啟發
laravel框架裡的佇列介紹
最好的講解方法當然是舉例子啦
-
首先,我們要搞明白幾個概念,從小到大依次有:佇列任務,佇列,連線。 他們屬於依次被包含的關係,一個佇列裡有許多的佇列任務,一個連線中可以有許多佇列
-
佇列任務: 對每個使用者都會進行的操作,理解為佇列任務,比方說使用者註冊時的,我們傳送驗證郵件的操作,每個使用者註冊,我們都會進行,這樣的任務我們可以把它抽象成一個佇列任務
-
佇列: 許多佇列擠在一起等著被處理,形成了一個佇列
-
連線: 佇列的儲存形式
-
佇列處理器 處理佇列任務的程式
-
-
舉例: 佇列任務:某個操作,例如發郵件這個操作,之後我們會用更簡單的操作舉例代替
佇列:佇列的存在是為了方便之後的佇列處理器處理對應的佇列任務,我們不做講解
連線:database(也就是指mysql),redis等,我們以database為主
實戰
-
通過這個命令生成任務類:
php artisan make:job SendEmail
會在這裡生成一個Jobs資料夾以及我們的任務類
順便建立一個
Controller
來負責分發任務php artisan make:controller QueueTest
-
具體的程式碼實現:
如何在控制器裡新建一個job,並傳遞引數呢?請看:
SendEmail.php:
QueueController.php:
路由--web.php:
建立job資料表:
php artisan queue:table
php artisan migrate
一個超簡易的新增佇列流程就完成了,起服務之後,我們用postman或者瀏覽器等工具傳送請求
然後你就會發現,即使我們沒有新增任務處理器,我們的任務還是嗖的一下被完成了,job表裡什麼都沒有,這是為什麼呢???
開啟.env檔案
把它改成database,重複剛才的請求,再檢視job表
-
開啟佇列任務處理器:
一行命令:
php artisan queue:work
這句話能加很多引數,這裡不做過多陳述,可以自己檢視文件的說明,很容易理解
我們會發現,任務直接被執行了,這是因為我們剛剛新增任務的時候,是以當時的時間為準並延遲一分鐘執行,當我們開啟處理器的時候早就到時間啦,所以那個佇列任務才會一下子被消費掉
-
用程式管理器supervisor來讓我們剛剛的工作管理員永久後臺執行,否則我們只能總開著終端視窗才能使任務處理器執行
-
安裝
pip install supervisor
-
配置
supervisor的啟動非常人性化,在命令列輸入
echo_supervisord_conf
會直接給我們一份預設的配置檔案內容,我們將其複製下來,在任意一個當前使用者有許可權的地方新建一個.ini或者.conf字尾結尾的檔案(我建立的路徑:/usr/local/etc/supervisord.ini
),將內容複製進去,儲存即可,但其中有一些內容需要我們略做修改為了更直觀的檢視我們的程式執行情況,進行如下修改,去除httpserver和port的註釋:
這樣可以讓我們在瀏覽器裡檢視程式執行情況
然後最後一行做如下修改:
這裡面放我們的laravel-worker 配置檔案,在這裡建立並編輯我們的laravel-worker.ini檔案
比較重要的幾個引數:
-
command
: 這裡按我的理解是指 supervisor會對這個command命令所產生的程式進行管理,但是由於我們不在專案資料夾下,不能直接php artisan queue:work
,所以我們在artisan前面加上我們的專案路徑,被馬賽克遮住的部分就是我們laravel專案的檔案目錄 -
user
: 當前的系統使用者名稱稱,root等你當前使用的使用者名稱即可 -
最後一行的
logfile
:這裡要選擇我們擁有許可權的目錄才可以,而且資料夾和檔案需要我們手動幫其建立
如此一來,supervisor的配製就大工告成了
然後 surpervisord -c 配置檔案目錄啟動,而我的命令就是:
supervisord -c /usr/local/etc/supervisord.ini
在瀏覽器裡輸入
http://localhost:9001
,就可以看到我們的任務處理器跑起來啦我們的佇列任務也順利執行成功
-
-