LoginSignup
1
1

Laravelのメールをキュー投入してバックグラウンドで処理する

Posted at

はじめに

前回の記事で2段階認証を実装したわけですが、公式ドキュメントにこんな記述がありました。

電子メールメッセージの送信はアプリケーションのレスポンス時間に悪影響を与える可能性があるため、多くの開発者はバックグラウンド送信のために電子メールメッセージをキューに投入することを選択します。

というわけで、2段階認証のコードを送信するメールをキュー投入してバックグラウンドで処理できるようにしたいと思います。

databaseキュードライバの設定

今回、キュードライバはDBを選択します。
公式ドキュメントに従い、ジョブを保存するためのテーブルを追加します。

php artisan queue:table
php artisan migrate

.envファイルでdatabaseキュードライバを指定します。

.env
...

QUEUE_CONNECTION=database

Mailableクラスの更新

Mail::toに対してqueueメソッドを追加しても良いのですが、
今回はデフォルトでキュー投入するようにしたいため、2段階認証のMailableクラスに対してShouldQueue契約を追加します。

変更前

app/Mail/TwoFactorAuthenticationPasswordMail.php
<?php

namespace App\Mail;
...

class TwoFactorAuthPasswordMail extends Mailable
{
    use Queueable, SerializesModels;

    ...
}

変更後

app/Mail/TwoFactorAuthenticationPasswordMail.php
<?php

namespace App\Mail;
...

class TwoFactorAuthPasswordMail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    ...
}

これだけで、メール送信のジョブがDBに登録されます。

キューワーカの実行

DBに登録されたジョブを処理するために、下記のコマンドでキューワーカを実行します。

php artisan queue:work

コマンド実行で、ジョブに溜まったメールが随時送信されることを確認できたかと思います。

しかしこのワーカはターミナルを閉じると停止してしまうので、バックグラウンドで動き続けるように設定してやる必要があります。

Supervisorの設定

公式ドキュメントに倣い、queue:workプロセスをバックグラウンドで永続的に実行し続けるためにSupervisorを設定します。

インストール

Supervisorはdnfで直接インストールすることができないため、pipを利用します。

$ sudo dnf -y install pip
$ pip install supervisor
$ supervisord -v
4.2.5

設定ファイルの作成

下記コマンドで設定ファイルを出力します。

$ sudo su -
$ echo_supervisord_conf > /etc/supervisord.conf

公式サイトを参考に値をいじる…わけですが、
私はほとんどこちらの参考サイトと同じように変更しました。ありがたし!

/etc/supervisord.conf
[unix_http_server]
file=/var/run/supervisor/supervisor.sock   ; ←変更

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; ←変更
pidfile=/var/run/supervisord.pid ; ←変更

[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; ←変更

[include]
files = /etc/supervisord.d/*.ini ; ←変更

ログとsockファイルのディレクトリ作成

Supervisorの設定ファイルの記述通り、ディレクトリを作成します。

$ mkdir -p /var/log/supervisor/
$ mkdir -p /var/run/supervisor/

sockファイルも作成。

$ touch /var/run/supervisor/supervisor.sock
$ chmod 777 /var/run/supervisor/supervisor.sock

サービスへ登録

systemctlコマンドで起動や停止ができるように、サービスへ登録します。

$ vi /lib/systemd/system/supervisord.service
/lib/systemd/system/supervisord.service
Description=Process Monitoring and Control Daemon
Documentation=http://supervisord.org
After=rc-local.service nss-user-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -n -c /etc/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl shutdown
ExecReload=/usr/local/bin/supervisorctl reload

[Install]
WantedBy=multi-user.target

Laravelキューワーカの設定ファイル作成

続いてLaravelキューワーカを永続化するための設定ファイルを作成します。

$ mkdir -p /etc/supervisord.d/
$ vi /etc/supervisord.d/laravel-worker.ini
/etc/supervisord.d/laravel-worker.ini
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/WEBAPP/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=ec2-user
numprocs=4
redirect_stderr=true
stdout_logfile=/tmp/worker.log

起動設定

最後にSupervisorの起動確認と、自動起動を設定して完了です。

$ systemctl daemon-reload
$ systemctl start supervisord
$ systemctl enable supervisord

おわりに

これまでも何度かSupervisorにはお世話になっていたのですが、今回初めて最初から設定しました。
意外と手間取りました:joy:

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1