Queue は、直訳すると「順番を待つ人や乗り物の列 」という意味です。
Laravel では、時間のかかる処理やなどを非同期で実行したい場合になどに使います。
今回は、AmazonS3へのアップロードをLaravel5.3のQueueで実装してみました。
必要な Composer package (composer require コマンド)
- composer require aws/aws-sdk-php
- composer require league/flysystem-aws-s3-v3
AWS3の設定
-
config/filesystems.php
のcloud
キーをs3
に - AWS3でBucket作成
-
disks
キーの中身を、作成したBucketに合わせて変更
ジョブクラスの作成・実装
-
php artisan queue:table
=> jobsテーブル(未実行なjobを格納する)を作成 -
php artisan queue:failed-table
=> failed_jobsテーブル(実行に失敗したjobを格納する)を作成 -
php artisan make:job UploadImage
すると app/Jobs
配下にUploadImage.php
が作られるので、以下のような感じにする
<?php
namespace App\Jobs;
use App\Models\Channel;
use File;
use Storage;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class UploadImage implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
public $channel;
public $fileId;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(Channel $channel, $fileId)
{
$this->channel = $channel;
$this->fileId = $fileId;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$path = storage_path() . '/uploads/' . $this->fileId;
$fileName = $this->fileId . '.png';
if(Storage::disk('s3images')->put('profile/' . $fileName, fopen($path, 'r+'))) {
File::delete($path);
}
$this->channel->image_fullname = $fileName;
$this->channel->save();
}
}
あとは、適当に画像アップロードしてあげて、受け取ったメソッド内でdispatchヘルパーを使って
$this->dispatch(new UploadImage($channel, $fileId));
みたいにしてあげればいい。
php artisan queue:work
を実行すると、リスナー的なのが走り、dispatchされたjobが自動的に実行される。
queueは他にも、例えばメールをバックグラウンドで送信したい場合などに使える。