Laravel Queueを利用して非同期によるメール送信

2020年6月2日

PHP

Queue(キュー)の機能を利用すると、ある任意の処理をジョブ( job)として保存・記録して、それら一連のジョブを非同期処理として実行することができます。

 

 

ジョブを保存するキュードライバとしての選択肢は、MySQL等のデータベース、Redis、Amazon SQSなどがあります(本記事ではMySQLを利用)。ジョブをキューへと送ることをディスパッチ(dispatchというメソッド)と呼び、コントローラーの適当な箇所に設定します。

 

キューに記録されたジョブ(より正確に言えば、ジョブのスタック(stack)としての塊がキュー)は、キューワーカによって実行されます。

 

本記事は下記関連ページの続きです。実装した「メールの送信機能」をジョブ(クラス)として作成し直し、Queueの機能を利用して非同期処理を実装してみます。

 

関連ページ

Mailableでメール送信機能を実装する

 

 

おおまかに以下のような手順で構築します。

 

・ジョブを記録するキュードライバとしてデータベース(テーブル)を用意する
・非同期処理を記述するジョブクラスの作成

・コントローラーにジョブをディスパッチする処理を記述
・キューワーカでジョブの実行

 

 

jobsテーブルの準備


 

.envファイルのQUEUE_CONNECTIONをsyncからdatabaseに変更します。

 

ジョブを保存するためのjobsテーブルのマイグレーションファイルを作成します。

 

マイグレーションを実行します。

 

以下のようなjobsテーブルが生成されます。

 

 

ジョブクラスの作成


 

SendHelloEmailという名前のジョブクラスを作成します。このジョブクラス内に非同期処理を記述します。

 

下記コマンドによって、JobsディレクトリとSendHelloEmail.phpファイルが生成されます。

 

下記のように編集します。

app/Jobs/SendHelloEmail.php

34〜37行目

handle()には非同期として実行されるジョブとしての処理を記述します。ここでは、上述の関連ページおいて元々コントローラ(ContactController.php)側に記述していたMailファザードによるメール送信を記述しています。

 

 

次にコントローラに、ジョブをディスパッチする処理を記述します。

 

app/Http/Controllers/ContactController.php

45行目

ジョブクラスのdispatchメソッドを記述しています。このタイミングでジョブがキューへと記録されます(jobsテーブルに記録される)。引数の$dataはジョブクラスのコンストラクタへと渡されます。

 

 

最後にキューワーカを起動します。このワーカによってキューに記録されたジョブが実行されていきます。

 

※ジョブクラスを編集した場合はこのキューワーカを再起動して下さい。

 

仮にdispatchに下記のようなdelayの処理を施すと、キュー(jobsテーブル)に投入されたジョブは1分後に実行されるようになります。

dispatchされたタイミングでjobsテーブルにはジョブが記録されますが、1分後にワーカによって実行されたタイミングでその記録が削除されるのが確認できます。

 

 

参照ページ


 

Laravel 7.x キュー

 

 

 

LINEで送る
Pocket

定番本
定期本
 
Copyright © 2020 思考の葉 All Rights Reserved.  プライバシーポリシー