LoginSignup
9
10

More than 5 years have passed since last update.

laravel/lumen キュー操作 の仕組み

Last updated at Posted at 2016-05-05

Laravel/Lumenにはキューを処理するための仕組みが入っていて、

タスクの非同期処理などを簡単に実行出来るようになっている。

Usage

  1. キューの設定を行う。
  2. タスククラスを作成する
  3. タスククラスのオブジェクトをキューのバスにぶち込む
  4. キューのリスナーを回す。

詳しくは
https://laravel.com/docs/5.2/queues

キューの設定

config/queue.php にキュー設定を入れます。

複数のストレージタイプに対応しているものの、どのストレージタイプを使うかはグローバルの模様。

DB の場合、

'database' => [
    'driver' => 'database',
    'table'  => 'jobs',
    'queue'  => 'default',
    'expire' => 60,
],

SQSの場合、

'sqs' => [
    'driver' => 'sqs',
    'key'    => '{{AWS_CREDENTIAL_KEY}}',
    'secret' => '{{AWS_YOUR_SECRET}}',
    'queue'  => '{{https:// から始まるキューのURL}}',
    'region' => '{{AWS_RESION}}',
],

ストレージの中でもqueueという項目があって、ランタイムで格納先をスイッチすることが可能なよう。

DBの場合、テーブルが必要。コレはphp artisan queue:tableコマンドで作れるが、lumeでは何故か入ってない。

Command自体は入っているのでServiceProvider経由で登録してあげればartisan 経由でも使えるように。

<?php
use Illuminate\Support\ServiceProvider;
use Illuminate\Queue\Console\TableCommand;

class HogeServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->commands([
            TableCommand::class
        ]);
    }
}

生成サれたmigrationファイルではFacade必須なので注意。
(artisan ファイル内で withFacade 呼ぶだけでもOK)

タスククラスの作成

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class MyJob implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;


    public function handle(){

    }

}

handleメソドにタスクの処理を入れておく。

必要なデータ等があればコンストラクタで突っ込めるようにしておくと良いっぽい。

キューのバスに登録

dispatch関数というのがあるのでコレにjobを渡せばOKみたい。

$job = new MyJob();
dispatch($job);

中身はこんな感じ

function dispatch($job)
{
    return app(Dispatcher::class)->dispatch($job);
}

登録時にキュー指定用の文字列を渡して、キューの切り替えが可能

$job = new MyJob();
dispatch($job)->onQueue('emails');

delay で キューの登録を遅延させることが可能。

$job = new MyJob();
dispatch($job)->delay(60 * 5);

指定は秒。設定可能秒数はキューストレージの設定に依存し、SQSだと最大15分程度

キューのリスナー

キューのリスナーを起動するにはartisan コマンドを使います。

php artisan queue:listen

リスナーは標準では、configに記載されたqueueのプールを利用するので、

onQueueなどでプールの切り分けをする場合には、--queue オプションを付けて、別のプロセスを起動する必要がある。

$ php artisan queue:listen --queue={queueのURL}

queue:listenは、queueの監視を延々と続けるが、queue:workはタスクを1つづづ処理してくれる。

php artisan queue:work

設計上のポイント

queueのコンポーネントが解決してくれる点は以下のあたり。

  • タスク処理に関する並列処理とかそんなん。
  • キューに追加したタスクの呼び出し。
  • キューテーブルに対するCRUD全般

逆に自分で設定したほうが良さそうなのは以下の点

  • プールの振り分けをどのような形で実装するか。
  • ログの出力だったりとかイベント。

基本的には永続性の無い一次キューストレージへの出し入れ、って所のハンドリングが主な機能なので、
ログを取りたかったり進捗見たかったり等、高度な(通常必要とサれるような)追跡が必要なケースでは、別の仕組みが必要。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10