タイトル: Maximum execution time of 30 seconds exceeded
エラー内容
|
Maximum execution time of 30 seconds exceeded |
PHPスクリプトの実行時間が max_execution_time で設定された上限(既定30秒)を超えたときに発生するエラーです。長時間処理・ループ過多・外部APIタイムアウトなどが原因です。
発生条件 / 原因
- 処理の実行時間が既定のものを過ぎたため。
- 大量データの一括処理 — 数万件以上のループ、CSV処理、画像変換
- 外部APIの応答待ち — タイムアウトせずに延々と待っている
- 無限ループ — 終了条件のミスでループから抜けない
- 巨大ファイルのアップロード処理 — 受信+処理に時間がかかる
- DBクエリが重い — インデックス不足やフルテーブルスキャン
対処法
1. 即効対処:実行時間の上限を上げる
php.iniのmax_execution_timeを変更する。
|
# php.ini |
2. スクリプトから一時的に変更
|
<?php |
3. CLI実行に切り替える
長時間のバッチ処理はWeb経由ではなくCLIで動かすのが原則。CLIでは max_execution_time は既定で0(無制限)です。
|
# Laravel artisan コマンド化が定石 |
4. 処理をチャンク化する
一度に全部処理するのではなく、件数を区切って繰り返し実行します。Laravel/PHP共通で有効。
|
// Laravel Eloquent の chunk() |
5. キュー(非同期ジョブ)に逃がす
本来Webリクエストで完結させるべきでない処理はキューに投げます。
|
// Laravel |
6. Webサーバー側のタイムアウトも確認
- Nginx:
fastcgi_read_timeout 300; - Apache:
Timeout 300、ProxyTimeout 300 - php-fpm:
request_terminate_timeout = 300
PHP側だけ伸ばしてもWebサーバー側で切られると 504 Gateway Timeout になります。
注意点
- 本番Webで
max_execution_timeを大きくしすぎない: 詰まったリクエストがリソースを長時間専有する - 根本対策はチャンク化/キュー化。タイムアウトを伸ばすのは一時対処
- 無限ループの可能性を疑う: ログを仕込んで進行を可視化
- 外部API呼び出しにはクライアント側のタイムアウトを必ず設定
関連
- 親カテゴリ: エラー一覧 (PHP)
- 同様のエラー: Fatal error: Maximum execution time of 30 seconds exceeded in...