この記事は、自身の以下のブログ記事の要旨をまとめたものです。
利用環境
- Laravel 9
- デプロイ先はエックスサーバー(スタンダードプラン)
結論から
レンタルサーバー(エックスサーバー)上で、Laravelのqueue ワーカープロセスを稼働させる際、cron エントリに以下のような設定にしました。
*/5 * * * * cd path/to/laravel_project && /opt/php-8.1/bin/php artisan queue:work --max-time=300 --timeout=36000 --env=production >> /dev/null 2>&1
ポイントは以下です。
- cron の実行周期を、5分に設定
- –max-time=300 に指定して、ワーカープロセスの生存時間を5分に設定
- 実行すべきジョブがなければワーカープロセスを停止する --stop-when-empty は、プロセス生成直後に停止してしまう可能性があるのでつけない
ダメな例
* * * * * cd path/to/laravel_project && /opt/php-8.1/bin/php artisan queue:work --max-time=36000 --timeout=36000 --env=production >> /dev/null 2>&1
以下の点がダメなポイントです。
- –max-time と –timeout を 36000秒(10時間!)というめちゃ大きな値にしている
- –stop-when-empty オプションをつけていないので、–max-time オプションで指定している秒数、ワーカープロセスが残り続ける
- cron の起動は最短間隔(1分ごと)にしてあるため、新しいワーカープロセスが頻繁に生成される
つまり、古いプロセスが消えることなく、新しいプロセスを次々に作ってしまう設定だったということです。
レンタルサーバのサポートから、高負荷なので対策するようにと警告を受け(ご迷惑おかけしました)、上記の設定に変更しました。
補足など
日本語ドキュメントにもqueue コマンドについて詳しく掲載されているので、そちらをご覧ください。
そもそもの話、supervisor などプロセスを永続化させるための仕組みが利用できるなら、そちらを利用したほうがよいと思います。