この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:atom
更新日時:2026-05-18 07:36:53

タイトル: 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.inimax_execution_timeを変更する。

# php.ini
max_execution_time = 300  ; 5分

2. スクリプトから一時的に変更

<?php
// このスクリプト内だけ300秒に拡張
ini_set('max_execution_time', 300);

// 無制限にする(CLIでは既定で0)
set_time_limit(0);

3. CLI実行に切り替える

長時間のバッチ処理はWeb経由ではなくCLIで動かすのが原則。CLIでは max_execution_time は既定で0(無制限)です。

# Laravel artisan コマンド化が定石
$ php artisan my:batch

# 単純なPHPスクリプトとして実行
$ php /path/to/batch.php

4. 処理をチャンク化する

一度に全部処理するのではなく、件数を区切って繰り返し実行します。Laravel/PHP共通で有効。

// Laravel Eloquent の chunk()
User::chunk(1000, function ($users) {
    foreach ($users as $user) {
        // 1000件ごとに処理
    }
});

5. キュー(非同期ジョブ)に逃がす

本来Webリクエストで完結させるべきでない処理はキューに投げます。

// Laravel
ProcessReport::dispatch($report);

// レスポンスはすぐ返し、ワーカが裏で処理

6. Webサーバー側のタイムアウトも確認

  • Nginx: fastcgi_read_timeout 300;
  • Apache: Timeout 300ProxyTimeout 300
  • php-fpm: request_terminate_timeout = 300

PHP側だけ伸ばしてもWebサーバー側で切られると 504 Gateway Timeout になります。

注意点

  • 本番Webで max_execution_time を大きくしすぎない: 詰まったリクエストがリソースを長時間専有する
  • 根本対策はチャンク化/キュー化。タイムアウトを伸ばすのは一時対処
  • 無限ループの可能性を疑う: ログを仕込んで進行を可視化
  • 外部API呼び出しにはクライアント側のタイムアウトを必ず設定

関連