本篇文章給大家?guī)砹?a href="http://m.babyishan.com/?golink=aHR0cHM6Ly93d3cucGhwLmNuL2NvdXJzZS9saXN0LzIzLmh0bWw=" target="_blank" rel="noopener">laravel的相關(guān)知識,其中主要介紹了laravel隊列、在什么情況下使用隊列、配置隊列儲存等相關(guān)問題,希望對大家有幫助。
【相關(guān)推薦:laravel】
本文將介紹如何在 laravel 中使用隊列,以及了解了為什么使用隊列
什么情況使用隊列?
耗時的,比如上傳一個文件后進行一些格式的轉(zhuǎn)化等。
需要保證送達率的,比如發(fā)送短信,因為要調(diào)用別人的 api,總會有幾率失敗,那么為了保證送達,重試就必不可少了。
記錄使用過程:
一、配置隊列存儲
隊列配置文件存放在 config/queue.php,默認為 sync 同步處理,這里可以選擇 redis,database 等,使用方法如下。
創(chuàng)建數(shù)據(jù)表存儲任務,執(zhí)行完 artisan 命令后運行數(shù)據(jù)遷移
php?artisan?queue:table php?artisan?migrate
Redis
為了使用 redis 隊列驅(qū)動,你需要在你的配置文件 config/database.php 中配置Redis的數(shù)據(jù)庫連接。
如果你的 Redis 隊列連接使用的是 Redis 集群,你的隊列名稱必須包含 key hash tag。這是為了確保所有的 Redis 鍵對于一個給定的隊列都置于同一哈希中:
'redis'?=>?[ 'driver'?=>?'redis', 'connection'?=>?'default', 'queue'?=>?'default', 'retry_after'?=>?90, ],
二、創(chuàng)建任務類
隊列的任務類在 app/Jobs/ 目錄下
php artisan make:job SaveBusLine
修改文件如下:
namespace?AppJobs; use?AppHttpRepositoryBusRepository; use?IlluminateBusQueueable; use?IlluminateQueueSerializesModels; use?IlluminateQueueInteractsWithQueue; use?IlluminateContractsQueueShouldQueue; use?IlluminateFoundationBusDispatchable; class?SaveBusLine?implements?ShouldQueue { use?Dispatchable,?InteractsWithQueue,?Queueable,?SerializesModels; /** *?任務最大嘗試次數(shù)。 * *?@var?int */ public?$tries?=?3; /** *?任務運行的超時時間。 * *?@var?int */ public?$timeout?=?60; private?$datum; /** *?Create?a?new?job?instance. *?@param?array|object?$datum * *?@return?void */ public?function?__construct($datum) { $this->datum?=?$datum; } /** *?Execute?the?job. * *?@return?void */ public?function?handle() { BusRepository::getInstent()->updateBusLine($this->datum); } }
在控制器或倉庫中調(diào)用隊列方法:
use?AppJobsSaveBusLine; use?CarbonCarbon; /*****************?隊列操作?start?*******************/ SaveBusLine::dispatch($arrayData)->delay(Carbon::now()->addMinute(1)); /*****************?隊列操作?end?*******************/
三、啟動隊列任務
php artisan queue:work
四、Supervisor 配置
安裝 Supervisor
Supervisor 是一個 linux 操作系統(tǒng)上的進程監(jiān)控軟件,它會在 queue:listen 或 queue:work 命令發(fā)生失敗后自動重啟它們。在 ubuntu 安裝 Supervisor,可以用以下命令:
sudo?apt-get?install?supervisor
{tip} 如果自己手動配置 Supervisor 聽起來有點難以應付,可以考慮使用 Laravel Forge,它能給你的 Laravel 項目自動安裝與配置 Supervisor。
配置 Supervisor
Supervisor 的配置文件一般是放在 /etc/supervisor/conf.d 目錄下。在這個目錄中你可以創(chuàng)建任意數(shù)量的配置文件來要求 Supervisor 怎樣監(jiān)控你的進程。例如我們創(chuàng)建一個 laravel-worker.conf 來啟動與監(jiān)控一個 queue:work 進程:
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php?~/laravel/artisan?queue:work?redis?--sleep=3?--tries=3 autostart=true autorestart=true user=lisgroup numprocs=8 redirect_stderr=true stdout_logfile=/home/lisgroup/logs/worker.log
這個例子里的 numprocs 命令會要求 Supervisor 運行并監(jiān)控 8 個 queue:work 進程,并且在它們運行失敗后重新啟動。當然,你必須更改 command 命令的 queue:work redis ,以顯示你所選擇的隊列驅(qū)動。還需要修改執(zhí)行的用戶 user=XXX
啟動 Supervisor
當這個配置文件被創(chuàng)建后,你需要更新 Supervisor 的配置,并用以下命令來啟動該進程:
sudo?supervisorctl?reread sudo?supervisorctl?update sudo?supervisorctl?start?laravel-worker:*
更多有關(guān) Supervisor 的設(shè)置與使用,請參考 Supervisor 官方文檔。
五、處理失敗的任務
有時候你隊列中的任務會失敗。不要擔心,本來事情就不會一帆風順。Laravel 內(nèi)置了一個方便的方式來指定任務重試的最大次數(shù)。當任務超出這個重試次數(shù)后,它就會被插入到 failed_jobs 數(shù)據(jù)表里面。要創(chuàng)建 failed_jobs 表的遷移文件,你可以用 queue:failed-table 命令,接著使用 migrate Artisan 命令生成 failed_jobs 表:
php?artisan?queue:failed-table php?artisan?migrate
然后運行隊列處理器,在調(diào)用 queue worker,命令時你應該通過 –tries 參數(shù)指定任務的最大重試次數(shù)。如果不指定,任務就會永久重試:
php?artisan?queue:work?redis?--tries=3
六、清除失敗任務
你可以在任務類里直接定義 failed 方法,它能在任務失敗時運行任務的清除邏輯。這個地方用來發(fā)一條警告給用戶或者重置任務執(zhí)行的操作等再好不過了。導致任務失敗的異常信息會被傳遞到 failed 方法:
namespace?AppJobs; use?Exception; use?AppPodcast; use?AppAudioProcessor; use?IlluminateBusQueueable; use?IlluminateQueueSerializesModels; use?IlluminateQueueInteractsWithQueue; use?IlluminateContractsQueueShouldQueue; class?ProcessPodcast?implements?ShouldQueue { use?InteractsWithQueue,?Queueable,?SerializesModels; protected?$podcast; /** *?創(chuàng)建一個新的任務實例。 * *?@param?Podcast?$podcast *?@return?void */ public?function?__construct(Podcast?$podcast) { $this->podcast?=?$podcast; } /** *?執(zhí)行任務。 * *?@param?AudioProcessor?$processor *?@return?void */ public?function?handle(AudioProcessor?$processor) { //?處理上傳播客... } /** *?要處理的失敗任務。 * *?@param?Exception?$exception *?@return?void */ public?function?failed(Exception?$exception) { //?給用戶發(fā)送失敗通知,等等... } }
【相關(guān)推薦:laravel】