Laravel佇列實現(概念講解與Supervisor配置)

不洗碗工作室發表於2018-01-14

作者:不洗碗工作室 - hanxiao

版權歸作者所有,轉載請註明出處

為什麼要使用佇列?

  1. 學個框架如果只會寫普通業務也太low了,我們要嘗試一些高階的玩法(๑•̀ㅂ•́)و✧!
  2. CSDN上的一篇有關訊息佇列的文章會給你很多啟發

laravel框架裡的佇列介紹

最好的講解方法當然是舉例子啦

  • 首先,我們要搞明白幾個概念,從小到大依次有:佇列任務,佇列,連線。 他們屬於依次被包含的關係,一個佇列裡有許多的佇列任務,一個連線中可以有許多佇列

    1. 佇列任務: 對每個使用者都會進行的操作,理解為佇列任務,比方說使用者註冊時的,我們傳送驗證郵件的操作,每個使用者註冊,我們都會進行,這樣的任務我們可以把它抽象成一個佇列任務

    2. 佇列: 許多佇列擠在一起等著被處理,形成了一個佇列

    3. 連線: 佇列的儲存形式

    4. 佇列處理器 處理佇列任務的程式

  • 舉例: 佇列任務:某個操作,例如發郵件這個操作,之後我們會用更簡單的操作舉例代替

    佇列:佇列的存在是為了方便之後的佇列處理器處理對應的佇列任務,我們不做講解

    連線:database(也就是指mysql),redis等,我們以database為主

實戰

  1. 通過這個命令生成任務類:

    php artisan make:job SendEmail

    Laravel佇列實現(概念講解與Supervisor配置)

    會在這裡生成一個Jobs資料夾以及我們的任務類

    順便建立一個Controller來負責分發任務

    php artisan make:controller QueueTest

  2. 具體的程式碼實現:

    如何在控制器裡新建一個job,並傳遞引數呢?請看:

    SendEmail.php:

    Laravel佇列實現(概念講解與Supervisor配置)

    QueueController.php:

    Laravel佇列實現(概念講解與Supervisor配置)

    路由--web.php:

    Laravel佇列實現(概念講解與Supervisor配置)

    建立job資料表:

    php artisan queue:table php artisan migrate

    一個超簡易的新增佇列流程就完成了,起服務之後,我們用postman或者瀏覽器等工具傳送請求

    Laravel佇列實現(概念講解與Supervisor配置)

    然後你就會發現,即使我們沒有新增任務處理器,我們的任務還是嗖的一下被完成了,job表裡什麼都沒有,這是為什麼呢???

    開啟.env檔案

    Laravel佇列實現(概念講解與Supervisor配置)

    把它改成database,重複剛才的請求,再檢視job表

    Laravel佇列實現(概念講解與Supervisor配置)

  3. 開啟佇列任務處理器:

    一行命令:php artisan queue:work

    這句話能加很多引數,這裡不做過多陳述,可以自己檢視文件的說明,很容易理解

    Laravel佇列實現(概念講解與Supervisor配置)

    我們會發現,任務直接被執行了,這是因為我們剛剛新增任務的時候,是以當時的時間為準並延遲一分鐘執行,當我們開啟處理器的時候早就到時間啦,所以那個佇列任務才會一下子被消費掉

  4. 用程式管理器supervisor來讓我們剛剛的工作管理員永久後臺執行,否則我們只能總開著終端視窗才能使任務處理器執行

    1. 安裝

      pip install supervisor

    2. 配置

      supervisor的啟動非常人性化,在命令列輸入echo_supervisord_conf 會直接給我們一份預設的配置檔案內容,我們將其複製下來,在任意一個當前使用者有許可權的地方新建一個.ini或者.conf字尾結尾的檔案(我建立的路徑:/usr/local/etc/supervisord.ini),將內容複製進去,儲存即可,但其中有一些內容需要我們略做修改

      為了更直觀的檢視我們的程式執行情況,進行如下修改,去除httpserver和port的註釋:

      Laravel佇列實現(概念講解與Supervisor配置)

      這樣可以讓我們在瀏覽器裡檢視程式執行情況

      然後最後一行做如下修改:

      Laravel佇列實現(概念講解與Supervisor配置)

      這裡面放我們的laravel-worker 配置檔案,在這裡建立並編輯我們的laravel-worker.ini檔案

      Laravel佇列實現(概念講解與Supervisor配置)

      比較重要的幾個引數:

      • 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,就可以看到我們的任務處理器跑起來啦

      Laravel佇列實現(概念講解與Supervisor配置)

      我們的佇列任務也順利執行成功

      Laravel佇列實現(概念講解與Supervisor配置)

    參考:laravel社群的一篇關於supervisor執行佇列任務處理器的文章

相關文章