[PHP] max_execution_time, set_time_limit, ini_set

PHPスクリプトの実行時間制限に関する関数などについてのメモ。

<?php
// max_execution_time はPHPスクリプトの
// 実行時間制限をする php.ini ディレクティブ。
// デフォルトのmax_execution_time は たぶん30秒

// ini_get() で php.ini の設定を取得できる。
// max_execution_timeを表示してみる。
echo "default : ", ini_get("max_execution_time"), " seconds\n";

// set_time_limit()で実行時間を変更できる。
// というだけの動作だけではないので
// http://jp.php.net/manual/ja/function.set-time-limit.phpを読んだほうがいい
set_time_limit( 3 );
echo "set_time_limit() : ", ini_get("max_execution_time"), " seconds\n";

// ini_set() で max_execution_time を1秒に変更する
ini_set("max_execution_time", 1 );
echo "after ini_set : ", ini_get("max_execution_time"), " seconds\n";

// sleep() の時間は実行時間制限には加算しない。
// sleep 以外にも system() などは同じ。詳細は
//http://jp2.php.net/manual/ja/features.file-upload.common-pitfalls.php
echo "going to sleep...\n";
sleep(1);

// 無限ループ
$str = "Z"; for( $i=0; $i < 11; $i++) { $str .= $str ;}
while( TRUE ){
  heavy_func( "***infinity roop...***\n", $str );
}

function heavy_func( $output, $str ){
  for( $i=0; $i < 1111; $i++) {
    $hoge = preg_replace("/^[0-9a-zA-Z]+$/usix", $output, $str);
  }
  echo htmlentities( $hoge ) ;
}
?>

結果

default : 30 seconds
set_time_limit? : 3 seconds
after ini_set : 1 seconds
going to sleep...
***infinity roop...***
***infinity roop...***
***infinity roop...***
  ~中略~
***infinity roop...***
***infinity roop...***
***infinity roop...***

Fatal error:  Maximum execution time of
 1 second exceeded in *** on line 34

終わらない無限ループにより強制終了。

Share
関連記事