LaravelのQueueWorkerエラー:Memory limit exceeded の対応策

投稿日 2024年09月19日   更新日 2024年09月19日

LaravelのQueueWorkerでメモリ制限に達するエラーは、大規模なプロジェクトや複雑なジョブ処理を行う際によく発生する問題です。このエラーは、アプリケーションのパフォーマンスに深刻な影響を与える可能性があるため、迅速な対応が求められます。

エラーの原因

「Memory limit exceeded」エラーは、PHPのメモリ制限を超えた場合に発生します。QueueWorkerがジョブを処理する際に、割り当てられたメモリ量を超過してしまうことが主な原因です。これは、以下のような状況で起こりやすくなります:
1. 大量のデータを処理するジョブ
2. メモリリークを引き起こすコード
3. 無限ループや非効率なアルゴリズム
4. 外部APIとの連携で大量のデータをメモリに保持

対応策

1. PHPのメモリ制限を増やす

最も簡単な解決策は、PHPのメモリ制限を増やすことです。`php.ini`ファイルを編集するか、Laravelの`.env`ファイルで以下のように設定します:
PHP_MEMORY_LIMIT=512M
ただし、この方法はサーバーリソースに余裕がある場合にのみ推奨されます。

2. ジョブの最適化

ジョブ内のコードを見直し、メモリ使用量を削減する最適化を行います:
  • 大きな配列やオブジェクトを適切に解放する
  • ストリーミング処理を利用して大量のデータを扱う
  • データベースクエリの最適化

3. ジョブの分割

大規模なジョブを小さな単位に分割し、それぞれを別々のジョブとして実行することで、メモリ使用量を抑えることができます。

4. キューワーカーの設定調整

`queue:work`コマンドにオプションを追加して、メモリ使用量を制御します:
php artisan queue:work --memory=128 --max-jobs=100
これにより、メモリ使用量が128MBを超えるか、100ジョブ処理した時点でワーカーが再起動されます。

5. Supervisor設定の最適化

Supervisorを使用している場合、設定ファイルを調整してワーカーの動作を最適化します:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:work --sleep=3 --tries=3 --memory=128
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/path/to/worker.log

6. ガベージコレクションの強制

長時間動作するジョブでは、手動でガベージコレクションを強制実行することでメモリを解放できます:
gc_collect_cycles();

7. プロファイリングツールの使用

XdebugやBlackfireなどのプロファイリングツールを使用して、メモリ使用量の多い箇所を特定し、最適化を行います。

まとめ

LaravelのQueueWorkerで発生する「Memory limit exceeded」エラーは、適切な対策を講じることで解決できます。メモリ制限の増加、コードの最適化、ジョブの分割、キューワーカーの設定調整など、複数のアプローチを組み合わせることで、効果的に問題に対処できます。定期的なモニタリングとパフォーマンスチューニングを行うことで、安定したQueueWorkerの運用が可能となります。
Resumy AI監修者
監修者: RESUMY.AI編集部

ヨーロッパのテックハブであるロンドンにて、シニアデベロッパーとしてチームを率いた後、オンライン教育プラットフォームUdemyでモダン技術に関する講義を配信する「Daiz Academy」を設立。現在はAIテクノロジー企業 Chott, Inc.を運営しています。

監修者: RESUMY.AI編集部
Resumy AI監修者

ヨーロッパのテックハブであるロンドンにて、シニアデベロッパーとしてチームを率いた後、オンライン教育プラットフォームUdemyでモダン技術に関する講義を配信する「Daiz Academy」を設立。現在はAIテクノロジー企業 Chott, Inc.を運営しています。

AI職務経歴書作成サービス RESUMY.AIAI職務経歴書作成サービス RESUMY.AI
60秒で完了