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の運用が可能となります。
関連記事

新着記事
4
5
6
関連記事
4
5
6


60秒で完了