hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

PHPスクリプトの実行時間を制御する(max_execution_time)

PHPで処理に時間のかかるスクリプトを実行すると以下のようなエラーメッセージが表示される場合があります。

Fatal error: Maximum execution time of 60 seconds exceeded
(日本語訳 -> 致命的な誤り: 超えられていた最大60秒の実行時間)

簡単に言うと、「60秒待ったけど応答が戻ってこないからタイムアウトエラーにします。」という感じです。
これを解決するにはPHPの設定オプションである「max_execution_time」の設定値を変更します。

php.iniで設定する

「max_execution_time」はphp.iniでデフォルト値が設定されています。
デフォルトは60秒なので、これを120秒や180秒にすることで、タイムアウトまでの時間を延ばす事が出来ます。
0秒を指定した場合は、「タイムアウトをしない」という設定になり処理が終わるまで待ち続けます。

php.iniでの設定
; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
;max_execution_time = 60

; タイムアウトを3分に設定
max_execution_time = 180;

; タイムアウトをしないに設定(処理が終わるまで待ち続ける)
max_execution_time = 0;

ini_setで設定する

「max_execution_time」をphp.iniで設定してしまうと、全てのPHPプログラムのタイムアウトまでの時間が変更されてしまい、プログラムの処理待ちが多く発生する可能性が出てきます。
特定のプログラムに対してだけタイムアウトの時間を変更したい場合は、「ini_set」が使用できます。

string ini_set ( string $varname , string $newvalue )
指定した設定オプションの値を設定します。 設定オプションは、スクリプトの実行中は新しい値を保持し、 スクリプト終了時に元の値へ戻されます。

ini_set - PHP Manual より

つまり、「ini_set」を使用すれば、他のプログラムには影響させずに、特定のプログラムだけ設定オプションを変更した形で実行する事が出来ます。

ini_setでの設定
<?php
ini_set("max_execution_time",180);
?>

set_time_limitで設定する

「max_execution_time」について、特定のプログラムに対してだけタイムアウトの時間を変更したい場合、先の「ini_set」の他にも「set_time_limit」を使用する事ができます。

set_time_limitでの設定
<?php
set_time_limit(180);
?>

コマンドラインでの実行時はmax_execution_timeは0と見なされる

php.iniでは「max_execution_time」のデフォルト値として「60秒」が設定されていますが、コマンドラインから実行するPHPプログラムの場合はこの設定値は「0(タイムアウトしない)」と見なされます。

例えば以下のようなプログラムをコマンドラインから実行した場合、タイムアウトは発生せずに正常に処理が終了します。

サンプルプログラム
 start\n";
sleep(70); // 70秒間待ち
echo date("Y/m/d H:i:s")." -> end\n";
?>
サンプルプログラムを実行
$ php ./maxtime.php
2010/09/23 00:03:35 -> start
2010/09/23 00:04:45 -> end

コマンドラインからの実行で明示的にタイムアウト時間を指定したい場合は、「-d max_execution_time=秒数」の形でオプションを指定して実行します。

サンプルプログラムを実行「-d max_execution_time=60」を指定
$ php -d max_execution_time=60 ./maxtime.php
2010/09/23 00:05:30 -> start

Fatal error: Maximum execution time of 60 seconds exceeded in C:\xampp\htdocs\maxtime.php on line 4

今回参考にしたページ

Maximum execution time of 60 seconds exceeded と怒られた
http://d.hatena.ne.jp/kakku22/20080528/1211959500

PHPの実行時間 max_execution_time
http://kaworu.jpn.org/kaworu/2008-07-09-1.php

ini_set - PHP Manual
http://php.net/manual/ja/function.ini-set.php

set_time_limit - PHP Manual
http://php.net/manual/ja/function.set-time-limit.php