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

做者:不洗碗工做室 - hanxiaophp

版權歸做者全部,轉載請註明出處mysql

爲何要使用隊列?

  1. 學個框架若是隻會寫普通業務也太low了,咱們要嘗試一些高級的玩法(๑•̀ㅂ•́)و✧!
  2. CSDN上的一篇有關消息隊列的文章會給你不少啓發

laravel框架裏的隊列介紹

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

  • 首先,咱們要搞明白幾個概念,從小到大依次有:隊列任務,隊列,鏈接。 他們屬於依次被包含的關係,一個隊列裏有許多的隊列任務,一個鏈接中能夠有許多隊列laravel

    1. 隊列任務: 對每一個用戶都會進行的操做,理解爲隊列任務,比方說用戶註冊時的,咱們發送驗證郵件的操做,每一個用戶註冊,咱們都會進行,這樣的任務咱們能夠把它抽象成一個隊列任務web

    2. 隊列: 許多隊列擠在一塊兒等着被處理,造成了一個隊列redis

    3. 鏈接: 隊列的儲存形式sql

    4. 隊列處理器 處理隊列任務的進程瀏覽器

  • 舉例: 隊列任務:某個操做,例如發郵件這個操做,以後咱們會用更簡單的操做舉例代替框架

    隊列:隊列的存在是爲了方便以後的隊列處理器處理對應的隊列任務,咱們不作講解工具

    鏈接:database(也就是指mysql),redis等,咱們以database爲主post

實戰

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

    php artisan make:job SendEmail

    會在這裏生成一個Jobs文件夾以及咱們的任務類

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

    php artisan make:controller QueueTest

  2. 具體的代碼實現:

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

    SendEmail.php:

    QueueController.php:

    路由--web.php:

    創建job數據表:

    php artisan queue:table php artisan migrate

    一個超簡易的添加隊列流程就完成了,起服務以後,咱們用postman或者瀏覽器等工具發送請求

    而後你就會發現,即便咱們沒有添加任務處理器,咱們的任務仍是嗖的一下被完成了,job表裏什麼都沒有,這是爲何呢???

    打開.env文件

    把它改爲database,重複剛纔的請求,再查看job表

  3. 開啓隊列任務處理器:

    一行命令:php artisan queue:work

    這句話能加不少參數,這裏不作過多陳述,能夠本身查看文檔的說明,很容易理解

    咱們會發現,任務直接被執行了,這是由於咱們剛剛添加任務的時候,是以當時的時間爲準並延遲一分鐘執行,當咱們開啓處理器的時候早就到時間啦,因此那個隊列任務纔會一會兒被消費掉

  4. 用進程管理器supervisor來讓咱們剛剛的任務管理器永久後臺運行,不然咱們只能總開着終端窗口才能使任務處理器運行

    1. 安裝

      pip install supervisor

    2. 配置

      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,就能夠看到咱們的任務處理器跑起來啦

      咱們的隊列任務也順利執行成功

    參考:laravel社區的一篇關於supervisor運行隊列任務處理器的文章

相關文章
相關標籤/搜索