您好,登錄后才能下訂單哦!
這篇文章主要講解了“Laravel隊(duì)列如何使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Laravel隊(duì)列如何使用”吧!
耗時(shí)的,比如上傳一個(gè)文件后進(jìn)行一些格式的轉(zhuǎn)化等。
需要保證送達(dá)率的,比如發(fā)送短信,因?yàn)橐{(diào)用別人的 api,總會(huì)有幾率失敗,那么為了保證送達(dá),重試就必不可少了。
記錄使用過程:
隊(duì)列配置文件存放在 config/queue.php,默認(rèn)為 sync 同步處理,這里可以選擇 redis,database 等,使用方法如下。
數(shù)據(jù)庫(kù)
創(chuàng)建數(shù)據(jù)表存儲(chǔ)任務(wù),執(zhí)行完 artisan 命令后運(yùn)行數(shù)據(jù)遷移
php artisan queue:table php artisan migrate
Redis
為了使用 redis 隊(duì)列驅(qū)動(dòng),你需要在你的配置文件 config/database.php 中配置Redis的數(shù)據(jù)庫(kù)連接。
如果你的 Redis 隊(duì)列連接使用的是 Redis 集群,你的隊(duì)列名稱必須包含 key hash tag。這是為了確保所有的 Redis 鍵對(duì)于一個(gè)給定的隊(duì)列都置于同一哈希中:
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ],
隊(duì)列的任務(wù)類在 app/Jobs/ 目錄下
php artisan make:job SaveBusLine
修改文件如下:
namespace App\Jobs; use App\Http\Repository\BusRepository; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class SaveBusLine implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * 任務(wù)最大嘗試次數(shù)。 * * @var int */ public $tries = 3; /** * 任務(wù)運(yùn)行的超時(shí)時(shí)間。 * * @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); } }
在控制器或倉(cāng)庫(kù)中調(diào)用隊(duì)列方法:
use App\Jobs\SaveBusLine; use Carbon\Carbon; /***************** 隊(duì)列操作 start *******************/ SaveBusLine::dispatch($arrayData)->delay(Carbon::now()->addMinute(1)); /***************** 隊(duì)列操作 end *******************/
php artisan queue:work
安裝 Supervisor
Supervisor 是一個(gè) Linux 操作系統(tǒng)上的進(jìn)程監(jiān)控軟件,它會(huì)在 queue:listen 或 queue:work 命令發(fā)生失敗后自動(dòng)重啟它們。在 Ubuntu 安裝 Supervisor,可以用以下命令:
sudo apt-get install supervisor
{tip} 如果自己手動(dòng)配置 Supervisor 聽起來(lái)有點(diǎn)難以應(yīng)付,可以考慮使用 Laravel Forge,它能給你的 Laravel 項(xiàng)目自動(dòng)安裝與配置 Supervisor。
配置 Supervisor
Supervisor 的配置文件一般是放在 /etc/supervisor/conf.d 目錄下。在這個(gè)目錄中你可以創(chuàng)建任意數(shù)量的配置文件來(lái)要求 Supervisor 怎樣監(jiān)控你的進(jìn)程。例如我們創(chuàng)建一個(gè) laravel-worker.conf 來(lái)啟動(dòng)與監(jiān)控一個(gè) queue:work 進(jìn)程:
[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
這個(gè)例子里的 numprocs 命令會(huì)要求 Supervisor 運(yùn)行并監(jiān)控 8 個(gè) queue:work 進(jìn)程,并且在它們運(yùn)行失敗后重新啟動(dòng)。當(dāng)然,你必須更改 command 命令的 queue:work redis ,以顯示你所選擇的隊(duì)列驅(qū)動(dòng)。還需要修改執(zhí)行的用戶 user=XXX
啟動(dòng) Supervisor
當(dāng)這個(gè)配置文件被創(chuàng)建后,你需要更新 Supervisor 的配置,并用以下命令來(lái)啟動(dòng)該進(jìn)程:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:*
有時(shí)候你隊(duì)列中的任務(wù)會(huì)失敗。不要擔(dān)心,本來(lái)事情就不會(huì)一帆風(fēng)順。Laravel 內(nèi)置了一個(gè)方便的方式來(lái)指定任務(wù)重試的最大次數(shù)。當(dāng)任務(wù)超出這個(gè)重試次數(shù)后,它就會(huì)被插入到 failed_jobs 數(shù)據(jù)表里面。要?jiǎng)?chuàng)建 failed_jobs 表的遷移文件,你可以用 queue:failed-table 命令,接著使用 migrate Artisan 命令生成 failed_jobs 表:
php artisan queue:failed-table php artisan migrate
然后運(yùn)行隊(duì)列處理器,在調(diào)用 queue worker,命令時(shí)你應(yīng)該通過 --tries 參數(shù)指定任務(wù)的最大重試次數(shù)。如果不指定,任務(wù)就會(huì)永久重試:
php artisan queue:work redis --tries=3
你可以在任務(wù)類里直接定義 failed 方法,它能在任務(wù)失敗時(shí)運(yùn)行任務(wù)的清除邏輯。這個(gè)地方用來(lái)發(fā)一條警告給用戶或者重置任務(wù)執(zhí)行的操作等再好不過了。導(dǎo)致任務(wù)失敗的異常信息會(huì)被傳遞到 failed 方法:
namespace App\Jobs; use Exception; use App\Podcast; use App\AudioProcessor; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class ProcessPodcast implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; protected $podcast; /** * 創(chuàng)建一個(gè)新的任務(wù)實(shí)例。 * * @param Podcast $podcast * @return void */ public function __construct(Podcast $podcast) { $this->podcast = $podcast; } /** * 執(zhí)行任務(wù)。 * * @param AudioProcessor $processor * @return void */ public function handle(AudioProcessor $processor) { // 處理上傳播客... } /** * 要處理的失敗任務(wù)。 * * @param Exception $exception * @return void */ public function failed(Exception $exception) { // 給用戶發(fā)送失敗通知,等等... } }
感謝各位的閱讀,以上就是“Laravel隊(duì)列如何使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Laravel隊(duì)列如何使用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。