Laravel5のQueueを使う

スポンサーリンク

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"

基本的な部分

  1. Laravelがキューに登録する
  2. Laravelのキューリスナーがキューを監視していて、
  3. キューがあったらjobに渡して処理する
  4. 処理に失敗したらキューにもう一度登録される

というのが大体基本的な流れです。
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は意外と簡単なので、使うといいかも。
非同期で処理させたいときに重宝しそうです。

コメント

タイトルとURLをコピーしました