做者:不洗碗工做室 - hanxiaophp
版權歸做者全部,轉載請註明出處mysql
首先,咱們要搞明白幾個概念,從小到大依次有:隊列任務,隊列,鏈接。 他們屬於依次被包含的關係,一個隊列裏有許多的隊列任務,一個鏈接中能夠有許多隊列laravel
隊列任務: 對每一個用戶都會進行的操做,理解爲隊列任務,比方說用戶註冊時的,咱們發送驗證郵件的操做,每一個用戶註冊,咱們都會進行,這樣的任務咱們能夠把它抽象成一個隊列任務web
隊列: 許多隊列擠在一塊兒等着被處理,造成了一個隊列redis
鏈接: 隊列的儲存形式sql
隊列處理器 處理隊列任務的進程瀏覽器
舉例: 隊列任務:某個操做,例如發郵件這個操做,以後咱們會用更簡單的操做舉例代替框架
隊列:隊列的存在是爲了方便以後的隊列處理器處理對應的隊列任務,咱們不作講解工具
鏈接:database(也就是指mysql),redis等,咱們以database爲主post
經過這個命令生成任務類:
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
,就能夠看到咱們的任務處理器跑起來啦
咱們的隊列任務也順利執行成功