首頁  >  文章  >  php框架  >  實例講解Laravel隊列的簡單使用

實例講解Laravel隊列的簡單使用

WBOY
WBOY轉載
2022-02-25 18:01:452647瀏覽

這篇文章為大家帶來了laravel的相關知識,其中主要介紹了Laravel隊列、在什麼情況下使用隊列、配置隊列儲存等相關問題,希望對大家有幫助。

實例講解Laravel隊列的簡單使用

【相關推薦:laravel學習教學

本文將介紹如何在Laravel 中使用佇列,以及了解為什麼使用隊列

什麼情況使用隊列?

耗時的,例如上傳一個檔案後進行一些格式的轉換等。

需要保證送達率的,例如發送短信,因為要調用別人的 api,總會有幾率失敗,那麼為了保證送達,重試就必不可少了。

記錄使用過程:

一、設定佇列儲存

佇列設定檔存放在config/queue.php,預設為sync 同步處理,這裡可以選擇redis,database等,使用方法如下。

資料庫

建立資料表儲存任務,執行完artisan 指令後執行資料遷移

php artisan queue:table
php artisan migrate

Redis

為了使用redis 佇列驅動,你需要在你的設定檔config/database.php 中設定Redis的資料庫連線。

如果你的 Redis 隊列連接使用的是 Redis 集群,你的隊列名稱必須包含 key hash tag。這是為了確保所有的Redis 鍵對於一個給定的佇列都置於同一雜湊中:

'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => 90,
],

二、建立任務類別

佇列的任務類別在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;
/**
* 任务最大尝试次数。
*
* @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);
}
}

在控制器或倉庫中呼叫佇列方法:

use App\Jobs\SaveBusLine;
use Carbon\Carbon;
/***************** 队列操作 start *******************/
SaveBusLine::dispatch($arrayData)->delay(Carbon::now()->addMinute(1));
/***************** 队列操作 end *******************/

三、啟動佇列任務

php artisan queue:work

#4、Supervisor 設定

安裝Supervisor

##Supervisor 是一個Linux 作業系統上的進程監控軟體,它會在queue:listen 或queue:work 命令發生失敗後自動重新啟動它們。在 Ubuntu 安裝 Supervisor,可以用以下指令:

sudo apt-get install supervisor

{tip} 如果自己手動設定 Supervisor 聽起來有點難以應付,可以考慮使用 Laravel Forge,它能給你的 Laravel 專案自動安裝與設定 Supervisor。

設定 Supervisor

Supervisor 的設定檔一般是放在 /etc/supervisor/conf.d 目錄下。在這個目錄中你可以建立任意數量的設定檔來要求 Supervisor 怎樣監控你的進程。例如我們建立一個laravel-worker.conf 來啟動與監控一個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 運行並監控8 個queue:work 進程,並且在它們運行失敗後重新啟動。當然,你必須更改 command 命令的 queue:work redis ,以顯示你所選的佇列驅動程式。還需要修改執行的使用者user=XXX

啟動Supervisor

#當這個設定檔被建立後,你需要更新Supervisor 的配置,並用以下指令來啟動該進程:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

更多關於Supervisor 的設定與使用,請參考Supervisor 官方文件。

五、處理失敗的任務

有時候你佇列中的任務會失敗。別擔心,本來事情就不會一帆風順。 Laravel 內建了一個方便的方式來指定任務重試的最大次數。當任務超出這個重試次數後,它就會被插入到 failed_jobs 資料表裡面。要建立failed_jobs 表的遷移文件,你可以用queue:failed-table 指令,接著使用migrate Artisan 指令產生failed_jobs 表:

php artisan queue:failed-table
php artisan migrate

然後執行佇列處理器,在呼叫queue worker,指令時你應該通過--tries 參數指定任務的最大重試次數。如果不指定,任務就會永久重試:

php artisan queue:work redis --tries=3

六、清除失敗任務

你可以在任務類別裡直接定義failed 方法,它能在任務失敗時執行任務的清除邏輯。這個地方用來發送警告給使用者或是重置任務執行的操作等再好不過了。導致任務失敗的例外訊息會被傳遞到 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;
/**
* 创建一个新的任务实例。
*
* @param Podcast $podcast
* @return void
*/
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
/**
* 执行任务。
*
* @param AudioProcessor $processor
* @return void
*/
public function handle(AudioProcessor $processor)
{
// 处理上传播客...
}
/**
* 要处理的失败任务。
*
* @param Exception $exception
* @return void
*/
public function failed(Exception $exception)
{
// 给用户发送失败通知,等等...
}
}

【相關推薦:

laravel影片教學

以上是實例講解Laravel隊列的簡單使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除