溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Laravel隊(duì)列如何使用

發(fā)布時(shí)間:2022-02-28 11:25:45 來(lái)源:億速云 閱讀:160 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“Laravel隊(duì)列如何使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Laravel隊(duì)列如何使用”吧!

什么情況使用隊(duì)列?

耗時(shí)的,比如上傳一個(gè)文件后進(jìn)行一些格式的轉(zhuǎn)化等。

需要保證送達(dá)率的,比如發(fā)送短信,因?yàn)橐{(diào)用別人的 api,總會(huì)有幾率失敗,那么為了保證送達(dá),重試就必不可少了。

記錄使用過程:

一、配置隊(duì)列存儲(chǔ)

隊(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,
],

二、創(chuàng)建任務(wù)類

隊(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 *******************/

三、啟動(dòng)隊(duì)列任務(wù)

php artisan queue:work

四、Supervisor 配置

安裝 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:*

五、處理失敗的任務(wù)

有時(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ù)

你可以在任務(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)注!

向AI問一下細(xì)節(jié)

免責(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)容。

AI