Fatal error: Maximum execution time of 30 seconds exceededの対処法

PHPでは無限ループなどの対策のため、PHP処理のタイムアウトが設定されています。

[参考記事] ブラウザの中止ボタンを押したときに処理を停止させる

このタイムアウトまでの時間は標準では30秒となっています。
PHPの処理が実行されて、30秒以上経過すると次のようなエラーが出て、PHPの処理は停止します。

Fatal error: Maximum execution time of 30 seconds exceeded

この時間を変更するにはいくつかの方法があります。

以下は120秒に変更する場合の設定例です。

php.ini

max_execution_time = 120

httpd.confや.htaccess

php_value max_execution_time 120

PHPファイル

PHPファイルの先頭に書きます。

set_time_limit(120);

タイムアウトを無制限にする

設定時間を0にすると、無制限になりますが無限ループが発生するとApacheやPHPタスクを停止させるまで永久に処理が動き続けるため、有限な値を設定することをお勧めします。

タイムアウトを無制限にしてもapacheやプロキシ、ブラウザなどにもタイムアウトがあります。
PHPではクライアントとの接続状態によって処理を停止することもあります。
[参考記事] ブラウザの中止ボタンを押したときに処理を停止させる

ブラウザのタイムアウトを防ぐには、継続的に出力処理をして、処理が続いていることをクライアントに知らせます。

echo str_pad('',1);
flush();

SAFE_MODEでは時間制限を変更できない

セーフモードではphp.iniなどで時間制限を変更することができません。

長い処理はリロードによって回避する

繰り返し処理などは何度かに分けて処理するようにし、タイムアウトを防ぐようにします。
時々ページをリロード表示させて、自動的にPHPの処理に戻るといった感じです。

<?php
  $step_max = 1000;// 1回の処理回数
?>
<html>
<head>
<script language="JavaScript"><!--
function PageJump(){
  if ('function' === typeof window.PageJump2){
    PageJump2();
  }
}

// --></script>
</head>
<body onLoad="PageJump();">
<?
  echo str_pad('',256);
  flush();

  $step = 0;
  while($step < $step_max){

〜〜〜〜〜〜
〜〜〜〜ここに処理を書きます。進捗状況を出力しておくといいです。
〜〜〜〜〜〜

    if($is_end == true){// 長い繰り返し処理が終わったらループを中断します。
      break;
    }

//ときどきブラウザにパケットを送ったほうがタイムアウトは防げます。
    echo str_pad('',256);
    flush();
    $step++;
  }

  if($step < $step_max){
?>
<p>処理が完了しました。</p>
</body>
</html>
<?php
    exit;
  }
?>
<script language="JavaScript"><!--
function PageJump2(){
// 処理が終わっていないときには再度、処理に戻ります。
// ブラウザのキャッシュを防ぐためにクエリをUNIXタイムでつけます。
  location.href = "<?php echo $_SERVER['PHP_SELF'];?>?<?php time();?>";
}
// --></script>
</body>
</html>

関連記事

スポンサーリンク

外部スタイルシートで2バイト文字が無視される

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る