• WEB

Laravel5.2 メールキューについて

  • いまこ
    いまこ システムちーむ
  • このエントリーをはてなブックマークに追加

こんにちは、いまこです。
今回はLaravelネタに戻ります。
他にネタがn…皆さんに少しでもLaravelについて知ってほしくて!!!

さて、今回はメールキューについて書いていこうと思います。
丁度お仕事で触ったので、忘れぬうちに…

キューって?

キュー(英: queue)、あるいは待ち行列はコンピュータの基本的なデータ構造の一つ。 データを先入れ先出しのリスト構造で保持するものである。 キューからデータを取り出すときには、先に入れられたデータから順に取り出される。 キューにデータを入れることをエンキュー、取り出すことをデキューという。

例えるなら、人気ラーメン屋さんがあり、その行列がキュー。
先頭の人は一番最初に食べることができ、最後尾の人は全ての人が食べ終わってからじゃなければ食べることが出来ない、
という感じです。

メールキューのメリット

メール送信処理をキューに登録し、バックグラウンドで処理をしてくれるので、サイトのレスポンスが早くなります。

使い方

ではLaravel5.2のメールキューの使い方について書いていきます。

ドライバの選択

まずはキューを保存するドライバを下記から選択します。

  • データベース
  • Beanstalkd
  • Amazon SQS
  • Redis
  • 同期(ローカル用途)

今回はRedisを使用していきたいと思います。

使用するドライバが決まったら、.envファイルに記述します


// .env

QUEUE_DRIVER=redis

キューへ登録

本来Laravelでキューを使用するには、Jobという実行処理を記述したファイルを作成しなければなりません。
しかしメールキューに関しては、Laravelが既に用意してくれていて、Mailファサードを使用すればOKです。


Mail::queue(viewファイル, データー, function ($message) {
    //
});

上記のように記述するだけで、キューに登録してくれます。

キューの実行

登録したキューを実行するには、キューリスナの起動が必要となります。
これもまた簡単で、artisanコマンドを使用すればOKです。


$ php artisan queue:listen

上記コマンド実行で、キューに登録された処理を実行してくれます。
逆にキューリスナを起動していなければ、どんどんキューが溜まってしまうので、注意が必要です。

ちなみに、artisanのqueueコマンドには色々オプションがあるので、
詳しくはこちらを参照ください。

メールキュー用メソッド

上記で説明したメソッドの他にも、メールキュー用のメソッドが存在します。

遅延キュー

キューの実行を遅らせます。


Mail::later(5(秒), viewファイル, データ, function ($message) {
    //
});

キュー名指定

キューに名前を付けます。


Mail::queueOn(キュー名, viewファイル, データー, function ($message) {
    //
});

キュー名指定 & 遅延

名前付きキューの実行を遅らせます。


Mail::laterOn(キュー名, 5(秒), viewファイル, データー, function ($message) {
    //
});

Supervisor

先ほど説明した通り、キューを実行するためには、キューリスナの実行が必要なので、常にキューリスナを実行しておく必要があります。
そこで、キューリスナの実行をデーモン化するために、公式サイトではSupervisorというパッケージが紹介されています。

Supervisorとは

Python製の軽量なプロセス管理ツールです。
常時起動させたいスクリプト等を、簡単にデーモン化させ、管理することが出来ます。

インストール

EPELリポジトリからインストールする方法と、
pip/easy_install(Pythonのパッケージマネージャ)からインストールする方法があります。
EPELリポジトリからのインストールだとバージョンが古いので、pip/easy_installからインストールすることをお勧めします。
ですので今回はeasy_installを使用してインストールします。


$ easy_install supervisor

※easy_installが使えない方はPythonをインストールして下さい

設定

ログ出力

ログの出力箇所を修正します。


# /etc/supervisord.conf

[supervisord]
logfile=/var/log/supervisord/supervisord.log

include

設定ファイルをincludeできるようにします。
今回は/etc/supervisord.d/に設定ファイルを作成することにします。


# /etc/supervisord.conf

[include]
files = /etc/supervisord.d/*.ini

設定ファイル作成

ファイル保存ディレクトリを作成します。
その中でデーモン化させたいスクリプト毎に、ファイルを作成します。


$ mkdir /etc/supervisord.d
$ touch /etc/supervisord.d/test.ini

設定記述

作成した、test.iniを使用するために設定を記述します。


# /etc/supervisord.d/test.ini

[program:test]
command=php [Laravelまでのパス] queue:work redis --daemon ; 実行コマンド
user=test ; 実行ユーザー
autostart=true ; 自動的に起動
autorestart=true ; 自動的に再起動
stdout_logfile=/var/log/supervisord/jobs/test.log ; ログファイルの場所
redirect_stderr=true ; エラー出力を標準出力にリダイレクトする

システムサービス登録(CentOS6系)

こちらを使用します。


$ curl -o /etc/rc.d/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec
$ chmod 755 /etc/rc.d/init.d/supervisord
$ chkconfig --add supervisord

WEB設定

WEBから作成した設定の起動等を操作することが出来るので、
その設定を行います。


# /etc/supervisord.conf

[inet_http_server]
port=127.0.0.1:9001

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=http://127.0.0.1:9001

http://127.0.0.1:9001
へアクセスすると、確認できます。

実際に動かす

では実際にメールキューを実行してみましょう。

メールキュー処理



use Mail;

Mail::queue('emails.test', [], function ($message) {
    $message->to('メールアドレス')->subject('テストメール');
});

キューリスナの設定

設定は先ほどの記述を参考にします。
http://127.0.0.1:9001/
にアクセスし、設定が読み込まれているか確認します。

stop

読み込まれており、現在は停止状態になっています。

処理実行

処理を記述したURLにアクセスします。
ここではわかりやすいように、すぐにキューを実行せずに、たまっているのを確認します。

処理実行後


$ redis-cli
redis 127.0.0.1:6379> keys *
1) "queues:default"

キューがたまっていることを確認できました。

キューリスナ実行

ではキューリスナを実行させます。

running

そして先ほどのようにキューを確認してみます。


$ redis-cli
redis 127.0.0.1:6379> keys *
(empty list or set)

キューがなくなっていて、メール送信処理が行われています。

最後に

Laravelでのメールキュー処理、意外と簡単でしょう?

終わり。

このエントリーをはてなブックマークに追加

いまこが最近書いた記事

WRITERS POSTS もっと見る

他にもこんな記事が読まれています!

  • WEB
  • マーケティング
  • サーバー・ネットワーク
  • ライフスタイル
  • お知らせ