Laravel/Lumenにはキューを処理するための仕組みが入っていて、
タスクの非同期処理などを簡単に実行出来るようになっている。
Usage
- キューの設定を行う。
- タスククラスを作成する
- タスククラスのオブジェクトをキューのバスにぶち込む
- キューのリスナーを回す。
詳しくは
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全般
逆に自分で設定したほうが良さそうなのは以下の点
- プールの振り分けをどのような形で実装するか。
- ログの出力だったりとかイベント。
基本的には永続性の無い一次キューストレージへの出し入れ、って所のハンドリングが主な機能なので、
ログを取りたかったり進捗見たかったり等、高度な(通常必要とサれるような)追跡が必要なケースでは、別の仕組みが必要。