LaravelのQueueを使う機会が出てきたので、調べてみました。
開発環境
- Laravel5.1
- Redis
設定
設定ファイルは、config/queue.php
となっています。
なお、デフォルトで対応しているドライバーは、Sync(同期),Database,Beanstalkd,IronMQ,Amazon SQS,Redisとなっています。
今回はRedisキューを利用してみます。
一旦仮なので、defaultの部分をredisに変えちゃいましょう。envファイルに書いてもいいですよ。
'default' => env('QUEUE_DRIVER', 'redis'),
なお、redisは同じサーバー上で動かしてるので、redisサーバーさえ動かしておけばOKです。
redisの設定はdatabase.phpの分と、queue.phpがあります。queue.phpのプロパティのqueueはdatabase.phpの方のキー値ですね。
一応補足
redisを使用する場合は、composerからpredisを入れる必要があります。
composer require predis/predis:"~1.0"
基本的な部分
- Laravelがキューに登録する
- Laravelのキューリスナーがキューを監視していて、
- キューがあったらjobに渡して処理する
- 処理に失敗したらキューにもう一度登録される
というのが大体基本的な流れです。
syncの場合は、同期的に扱うので、そのままjobが実行される感じです。
キューリスナーを起動していても、ログが吐かれないのでただのJobです。
Jobを作る
まずはJobを作らなければ話にならないので作りましょう。
$ php artisan make:job TestJob --queued
Job created successfully.
すると、app/Jobs/TestJob.php
が作成されているかと思います。
TestJobが呼ばれたことを確認するために、handleメソッドの中に以下を追加しておきましょう。
echo "テスト呼ばれたよ!\n";
Queueに登録する(dispatchする)
Jobは作ったので、あとはQueueに入れる必要があります。
Queueに入れる方法はいくつか有りますが、基本的な方法は、Controllerから入れる方法です。
個人個人で、Controllerを作っていると思いますので、そちらのメソッドに以下を追加しましょう。
$this->dispatch(new \App\Jobs\TestJob());
これでOK。なお、他のコントローラーではないクラスで行いたい場合は、Illuminate\Foundation\Bus\DispatchesJobs
トレイトをuseすると使えるようになります。
また、dispatchのあとに、->onQueue('default')
等と指定することで、対象のQueueを変更することが出来ます。このqueueはconfig/queue.phpのドライバーのqueueの値に設定する内容みたいです。
一応、これより前でQueue::connection
とかやれば他のキュードライバーに接続出来そう
キューリスナーを動かす
あとは、キューを監視するキューリスナーを起動させます。
php artisan queue:listen
上記を実行します。実際にちゃんと稼働させるには、supervisorなどのプロセス監視ツールを利用する必要があるのですが今回は省略。
アクセスしてみる
動かしたらあとは、ブラウザで対象のControllerのメソッドが動くURLにアクセスして、先ほどのキューリスナーを確認しましょう。
上手く行っていれば「テスト呼ばれたよ!」の文字がキューリスナーに表示されるかと思います。
これで基本的なキューの使い方が終わりです。
まとめ
Queueは意外と簡単なので、使うといいかも。
非同期で処理させたいときに重宝しそうです。
コメント