実務でqueueとjobについて理解がたりなくて、仕事に時間がかかったため記録としてまとめてました。
間違いがあればご指摘いただけますと幸いです。
queue(キュー)とjob(ジョブ)とは
非同期処理を行う仕組み
実務でよく見るのは、メール送信やcsv解析など時間がかかる処理はjobクラスで行う印象が強い
※私が実務で読んだコードもcsv解析で使用されていました
基本的なキューの設定について
キューの設定は以下の2つのファイルで行われる
.env
config/queue.php
ちなみにconfig/queue.phpにはデフォルトでsyncと設定されています。
これはsynchronizeという同期という意味です。つまり同期処理なので、テストや開発環境で使われ本番環境では使われません。
sync以外には、database, veanstalkd, sqs , redisがあります。
実務で使ったdatabaseでジョブを管理する方法について
ジョブをdatabaseに保存するということをまとめます。
①.envに以下の設定
QUEUE_CONNECTION = database
②config/queue.php
defaultにdatabaseを設定する
③jobのテーブルを追加
php artisan queue:table
php artisan migrate
④ジョブの作成
php artisan make:job SendPDFMail
⑤jobファイルの処理を記述。jobファイルを発火させる処理を書く
省きます。
⑥ワーカを実行する
キューの中にあるジョブは自動で実行されるわけではなく、別のプロセスであるWorker(ワーカ)が必要となる
php artisan queue:work
キューワーカの実行について
queue:workは手動で閉じるか、ターミナルを閉じるまで処理が続くようになる
上記コマンドはqueue:workコマンド中にコードを変更しても気づかないようになっている
そのため再起動が必要となる。
更新されたコードをリロードする必要も、アプリケーションの状態をリセットしたりするときも再起動する必要がない。ただし、queue:workコマンドよりも大幅に効率が低くなります。
php artisan queue:listen
本番環境でもqueue:workを再起動やらをやらないといけないの?
本番環境では、queue:workプロセスを実行し続ける手段が必要。
queue:workプロセスが終了したことを検出し、自動的に再起動できるプロセスモニタである、Supervisorを設定することができます。