こんにちは、いまこです。
今回はLaravelネタに戻ります。
他にネタがn…皆さんに少しでもLaravelについて知ってほしくて!!!
さて、今回はメールキューについて書いていこうと思います。
丁度お仕事で触ったので、忘れぬうちに…
目次
キューって?
例えるなら、人気ラーメン屋さんがあり、その行列がキュー。
先頭の人は一番最初に食べることができ、最後尾の人は全ての人が食べ終わってからじゃなければ食べることが出来ない、
という感じです。
メールキューのメリット
メール送信処理をキューに登録し、バックグラウンドで処理をしてくれるので、サイトのレスポンスが早くなります。
使い方
では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/
にアクセスし、設定が読み込まれているか確認します。
読み込まれており、現在は停止状態になっています。
処理実行
処理を記述したURLにアクセスします。
ここではわかりやすいように、すぐにキューを実行せずに、たまっているのを確認します。
処理実行後
$ redis-cli
redis 127.0.0.1:6379> keys *
1) "queues:default"
キューがたまっていることを確認できました。
キューリスナ実行
ではキューリスナを実行させます。
そして先ほどのようにキューを確認してみます。
$ redis-cli
redis 127.0.0.1:6379> keys *
(empty list or set)
キューがなくなっていて、メール送信処理が行われています。
最後に
Laravelでのメールキュー処理、意外と簡単でしょう?
終わり。