以前紹介した下記の文書ではQueueの基本設定を確認しました。今回は前回では行なっていないQueueの設定についてもう少し詳細に説明を行なっています。Laravelの環境などは下記の文章で構築したものを利用しています。ユーザ登録後に送信するWelcomeメールのジョブを利用してキューの動作確認を行なっていきますで下記の文書を先に読むことをお勧めします。別のConnectionを使って別のキューに入れるジョブの実行を遅らせるキューに入れたジョブの実行を遅らせたい時、delayメソッドを利用することができます。下記ではジョブがキューに入ってから3分後に実行できるように設定を行なっています。SendWelcomeMail::dispatch($user)->delay(now()->addMinutes(3));ユーザがユーザを登録を行なってから3分後にキューに入ったジョブが処理されました。App\Jobs\SendWelcomeMailジョブを即時実行させるジョブを遅らせるdelayメソッドが準備されていましたが、即座に実行するdispatchNowメソッドも準備されています。dispatchNowメソッドを使うとすぐにジョブが実行されます。この場合はキューを経由せず同期処理として実行されるため、登録したユーザはメールが送信するまで次の画面への移動しないので待ちが生じます。ジョブが失敗した場合の動作ジョブが失敗した場合にはどのような処理が行われるのか気になるところです。意図的にジョブを失敗させて動作確認を行なっていきます。メール送信のジョブSendWelcomeMail.phpファイルを開いて、handleメソッドにExceptionを追加します。}ジョブのコードの更新を行なったら、Workder(ワーカー)を更新する必要があります。ユーザ登録を実行するとジョブは失敗しても繰り返し実行されるのがわかります。・storage/logsの下に保存されているログファイルにもExceptionのエラーがジョブの実行数と同じ数書き込まれて膨大な量になります。登録を行なったユーザ側のブラウザには何もエラーは表示されません。再実行の間隔を変更するデフォルトでは失敗するとすぐに再実行されることがわかりました。–delayオプションを指定すると次に再実行までの時間を指定することができます。–delayオプションでは秒単位で指定できるので、下記ではジョブが失敗すると60秒後に再実行されます。60再実行回数を指定するデフォルトではジョブでエラーが発生すると再実行を続けることがわかりました。続く再実行の回数を設定することができます。–triesオプションを使い、再実行の回数を指定します。3としてので、3回目でFailed(失敗)しているのでそれ以上は再実行されません。App\Jobs\SendWelcomeMailキューに入っていたジョブもFailedするとキューから削除されます。ログファイルを確認すればエラーは確認できますが、どのジョブが失敗したのかを確認することはできません。Laravelでは失敗したジョブを登録するテーブルが準備されています。queue:failed-tableが準備されているので実行します。migrateコマンドを実行します。データベースにfailed_jobsテーブルが作成されます。seconds)作成後に失敗したジョブを確認するコマンドを実行してみます。jobs!と表示されます。失敗したジョブを登録するfailed_jobsテーブルが作成されたので、再度意図的にエラーが発生するジョブを実行してみましょう。ワーカーのtriesオプションは3で起動します。queue:failedコマンドを実行すると失敗したジョブの情報が登録されていることが確認できます。failed_jobテーブルを確認failed_jobsテーブルにも失敗したジョブに関する情報は登録されます。失敗したジョブを確認後、コードの修正を行う必要があります。コードの処理が完了後、失敗したジョブを再実行することができます。queue:retryコマンドを使用します。引数には失敗したジョブのIDを指定する必要があります。指定がなければ再実行できません。queue!実行するとジョブが実行されるのではなく、ジョブがキューに戻されるので、ワーカーが起動していなければ処理は行いません。修正を行なっても再度失敗した場合は、以前の失敗したジョブの情報はなくなり、新しいIDで新規で失敗したジョブがfailed_jobsテーブルに登録されます。App\Jobs\SendWelcomeMailRetryでも再度失敗ジョブのコードを修正したら必ずワーカーを再起動する必要があります。Retryをしてジョブが正常に完了するとfailed_jobsテーブルから前回失敗したジョブの情報は削除されます。失敗したジョブをテーブルから削除したい失敗したジョブはコードを修正し、ジョブをRetryして正常に処理が完了するとfailed_jobsテーブルから情報は削除されます。失敗したジョブを再実行する必要がない場合は削除することができます。queue:forgetコマンドを実行します。queue:flushコマンドを実行します。successfully!ジョブファイルで再実行回数を設定するジョブファイルの変数triesを設定することでジョブごとに再実行回数を指定することができます。ここではSendWelcomeMailジョブを使っているので下記のように$tries変数を追加します。queue:workには–triesオプションを指定していませんが、ジョブファイルで指定した$tires=5でジョブがFailedしていることがわかります。ジョブごとに個別に再実行回数を指定したい場合は$tires変数を利用します。queue:listenの2つがあります。queue:workではコードの変更があれば一度停止して、再度起動する必要がありますが、queue:listenだと一度起動をすればコードの修正を行なっても再起動する必要がありません。–tries等のオプションはどちらも使用することができます。queue:listenのほうがいいように思えるかもしれませんが、コードの変更がジョブを実行するために反映されるということはジョブの実行する度にフレームワークを読み込んでいることになり処理に負荷がかかることになります。queue:workは起動した時にフレームワークを読み込んで以後再起動するまでは読み込むことはないため、コードが起動中に反映されることはありませんが処理の負荷がqueue:listeneよりも低いことになります。開発時にはqueue:listenを使って、本番環境ではqueue:workを使うといった使い分けができます。queue:work:(queue:listenコマンドはqueue:workほど効率的ではありません。別のQueue_Connectionを利用する.envファイルのQUEUE_CONNECTIONでdatabaseを指定していても別のConnectionを利用することができます。下記のようにdispatchメソッドの後にonConnectionメソッドを追加し、使いたいキューの値を入力するとそのキューにジョブを入れることができます。SendWelcomeMail::dispatch($user)->onConnection('redis');実行するとredisのデータベースにジョブの情報が登録されます。そのジョブを実行したい場合は、ワーカーを起動する際にredisを指定します。redisのキューにジョブが入っていれば、下記のように実行されます。App\Jobs\SendWelcomeMail複数のキューを利用するこれまでのキューの動作確認では気にしてきませんでしたがキューにも名前が付いています。queue.phpを見るとその値を確認することができます。queueの値がdefaultとなっていますが、これがキューの名前です。defaultとなっていますが、これは変更することができます。90,],またキューは1つではなく複数のキューを利用することができます。下記のようにdispatchメソッドの後にonQueueメソッドを追加し、名前を入力するとその名前のキューにジョブが入ります。SendWelcomeMail::dispatch($user)->onQueue('Email');ユーザ登録を実行後、jobsテーブルの中身を確認するとqueue列にEmailと表示されていることが確認することができます。列queueにEmaildefaultとは異なる名前をつけているので通常通りワーカーを起動しても処理は行ないません。queue:work上記では実行されません。ワーカーを起動する時にも設定したキューの名前を指定する必要があります。–queueオプションでキューの名前を指定すると実行されます。App\Jobs\SendWelcomeMail例えばhighとlowという2つのキューを作成し、ジョブをいれた場合2つのキューを1つのワーカーで処理することができますが、先に記述したhighを先に処理し、次にlowのキューに入ったジョブの処理を行います。このようにキューに優先度をつけることができます。--queue=high,low別のConnectionを使って別のキューに入れるデフォルトでdatabaseのキューを利用していてもredisのキューを利用できることがわかりました。キューもデフォルトのdafaultではなく任意の名前のキューを作成することもわかりました。下記のようにonConnectionとonQueueを使うことでredisのキューを利用したEmailという名前のキューを作成することができます。別のConnectionを使って別のキューに入れる。