skillup

技術ブログ

PHP

Queueの登録と実際の処理に関して

投稿日:

実務でQueueに絡んだ処理をする機会があったのでメモ。

Queueとは

倉庫管理システムを作ってた時によく出たネタですが、時間がかかる処理があったとして、その処理は同期的に処理するのではなく、ストックしておき、あとで処理(あるいはajaxのように単純に非同期)したいなんてケースがあります。

こういう時に使われるのがQueueという概念です。

キュー(queue)とは?

上の例の方が私のよりわかりやすい・・・(汗)

Queueで大事なこととしては

「キューを記録しておく場所」「処理を登録する場面」「実際の処理を行う場面」の認識でしょうか。

これを理解するのに少し時間が掛かりました・・(汗)

Laravelでこれを実行して見ます。

Laravelでのキュー処理

全体的な処理ですが、下記リンクがわかりやすくこれが最小構成で一番わかりやすいです。このブログも8割以上ここのパクリです(笑)

Laravelの処理をQueueにスタックしてレスポンスのチューニングを行おう

キューを記録しておく場所

Laravelでストック場所として定義しておけるのは下記5つです。

  • sync・・defaultではこれ。同期処理らしく積極的に使う意味はないと思われます。
  • database・・DBに登録。
  • Beanstalk・・調査中(汗)
  • Amazon SQS・・AWSのサービスです。
  • Redis・・KVSのサービスです。

databaseがわかりやすいのでこれで見ておきます。
laravel5.5のキュー投入によるジョブ処理を導入する

下記2つのファイルを設定しておきましょう。

.env

app/queue.php

ちなみにdatabaseの場合、当然テーブルを作る必要があり、下記コマンドで下記のようなテーブルを自動作成しておくことができます。

処理を登録する場面(当然まだ処理は行いません)

次は使われる処理を登録します。

ちなみに一つ一つの処理をJobと呼びます。
LaravelではJobを下記コマンドですぐに作れます。

app/Jobs/TestJob.php

2秒たってログを吐くという簡単な処理を書きます。

そしてこの処理を登録します。

例えばwebであるURL(http://sample.com/queue)にアクセスをしたら登録するとします。

DBを見るとJobが登録されているのがわかります。

これでJobが登録されているのがわかるかと思います。

実際の処理を行う場面

ストックしたジョブを行う場面を見ていきます。

上記コマンドを実行するとDBに登録している処理が実行されます。
コンソールには下記のように処理が図れます。

ログを見ていると意図した文字が吐かれているのと、処理が行われているのがわかるかと思います。DBをみてあげるとJobが削除されているのがわかると思います。

ちなみに私が携わった処理の場合、登録は別処理だったため、結局この処理は使いませんでしたが、大変参考になりましたね・・・

 

 

-PHP
-

執筆者:


  1. […] Queueの登録と実際の処理に関して […]

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

PHPでのメール送信&カレントディレクトリ

PHPの小ネタ集です。 Contents1 メールでの改行2 PHPでのカレントディレクトリ メールでの改行 メールで改行する場合、いつも\nでOKだったんですが、本日これで送信すると送れないというバ …

no image

エラーハンドリング

エラーが起きた時にPHPだと画面に出ますが(出ない場合は画面が白くなります)、これを検知し、ログに吐いたり任意の処理をできるのがエラーハンドリングです。 フレームワークなどにはほぼこの仕組みが内在して …

no image

Laravelの認証(独自テーブル仕様)

Laravelで独自の認証をしたいときに少々大変だったのでメモなどを。 *ディフォルトのテーブルはuserで認証項目もemailとpasswordと決まっています。 いじるところが色々ありまして、列挙 …

no image

ロケール情報について

本日、csvファイルを読み込む処理を行っていたんですが、コンソールからコマンドを打つと化けずに、ウェブ上で見ると化けるという現象が発生。 csv,プログラムともに文字コードがutf8で統一していること …

no image

laravelでの名前空間変更

laravelでの名前空間変更について。 laravelでモデルの場所はディフォルトだとapp/直下に作られます。 これをapp/Modelというディレクトリを作ってnamespaceを正常に定義した …