Laravelでワーカーのプロセス監視をせずにキューを常駐させる

本番環境では、queue:workプロセスを実行し続ける手段が必要です。queue:workプロセスは、ワーカタイムアウトの超過や、queue:restartコマンドの実行など、さまざまな理由で実行を停止する場合があります。

このため、queue:workプロセスが終了したことを検出し、自動的に再起動できるプロセスモニタを構築する必要があります。

https://readouble.com/laravel/8.x/ja/queues.html

php artisan queue:workでワーカーを立ち上げると、そのプロセスが死んでるとキューに入ったものが処理されなくなってしまいます。


さらにコードが変わったときのプロセス再起動も必要になると…。

正統はプロセス監視を行うのがいいんでしょうが、ちょっとめんどくさかったのでcronで対応してみました。
* * * * * cd MyApp/ && php artisan queue:work --once --env=production >> /dev/null 2>&1
* * * * * cd MyApp/ && php artisan queue:work --stop-when-empty --env=production >> /dev/null 2>&1
このようにcronで一分に一回ワーカーを立ち上げることで、ほぼ常駐しているのと同じような状態を作り出せます(最大一分の処理遅延を許容できるなら)。
これならコードが変わっても再立ち上げも必要なし。

--once」ならキューに入ってるものを1つだけ処理。
--stop-when-empty」ならキューが空になるまで処理してくれます。

プロセスが多重で立ち上がったりしないかとも思いましたが、今のところそんなこともなさそうでちゃんと使えています。