キューの処理としてAWS SQS, RDBを用いたもの色々あります。
Redisを用いたキューイング処理を触ることに。それもすぐ。
お勉強しながらまとめます(。- .•)
もくじ
キューまわりの用語
Queue(キュー)
Job(ジョブ)が並ぶ列。ジョブは処理のこと。特に重い処理をジョブ化してキューに並ばせて後回しにすることで、アプリケーションのレスポンスが高速化します。
利用例)
ショッピングサイトのメール送信など。
dispatch
キューにジョブを並ばせる処理。
Supervisor
今回の場合、Laravelで生成されたqueue:workプロセスがダウンしていないか監視して、ダウンしたら復旧させる。
php artisan queue:work
これを永続化させる役割になります。
チュートリアル
通常はイベントで処理するけれど、今回はジョブで。
.env
## Redis CACHE_DRIVER=redis SESSION_DRIVER=redis REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 REDIS_READ_WRITE_TIMEOUT=60 QUEUE_CONNECTION=redis QUEUE_DRIVER=redis
redisとQueueの設定
$ docker-compose exec php-fpm php artisan make:job TestJob
app/Jobs/TestJob.php
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Support\Facades\Log; class TestJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { Log::info('テストJob'); } }
routes/web.php
Route::get('/', function(){ dispatch(new TestJob())->delay(now()->addMinutes(2)); return 'テストJobを追加したよ!'; });
->delay(now()->addMinutes(2));2分後に処理を行うように指定。
queue:workの起動
$ docker-compose exec php-fpm php artisan queue:work
http://localhost/
アクセスする。
これで2分後にジョブが行われる。
RDBで処理したい場合
.env
## MySQL DB_CONNECTION=mysql DB_HOST=mysql80 DB_PORT=3306 DB_DATABASE=appdb DB_USERNAME=root DB_PASSWORD=secret QUEUE_CONNECTION=database QUEUE_DRIVER=database
$ docker-compose exec php-fpm php artisan queue:table $ docker-compose exec php-fpm php artisan queue:failed-table $ docker-compose exec php-fpm php artisan migrate
キューワーカを停止させてから、起動させてください。
$ docker-compose exec php-fpm php artisan queue:work
Supervisorでワーカーを監視する
@see
- LaravelでRedisとSupervisorを導入してQueue/Jobを扱う【docker-compose】
- Laravel で Redis と Supervisor を使ってメール送信を非同期にする