[PHP]タイムアウト時間を設定する、について

Read More

PHPではタイムアウト時間を設定することができる。

php.iniではmax_execution_timeというディレクティブが存在し、
関数ではset_time_limit()、あるいはini_set('max_execution_time', {値})というものがある。



それは知っている。



今日、山田祥寛先生が書いた「プチリファレンスPHP4」を見ていて、set_time_limit()の項目の所で気になる記述を見つけた。

とりあえず原文ママ載せる↓
注意
php.ini上でmax_execution_timeパラメータが設定されている場合は、こちらが優先されます。

もう一度いう、これはset_time_limit()の説明ページのすぐ下に書いてあった記述だ。


えええ?

これ自分の読解力がおかしくないのであれば、set_time_limit()の関数よりphp.iniの設定の方が優先される、という具合に読めるのだが…

でも"こちらが優先されます"って言葉も何か変だな。
普通なら"そちらが優先されます"だよなあ。


うーん…


いやいやいや。



まあ試してみよう。
ってことで早速以下のように検証してみた。


まず、php.iniの設定を確認した。
max_execution_time = 60

ふむ、60秒ですな。



次にそのままの状態でphpinfo()をしてみた。

ふむ、当たり前の結果が出た。



次に、phpファイルの先頭でset_time_limit(0)をした直後にphpinfo()をしてみた。

結果はごらんの通り。
ちゃんとphp.iniの設定を上書きしている。



えー、この人が書いた本てめちゃめちゃ信用してるんだけどー



一応phpマニュアルを見てみた。

まずはmax_execution_time。

セーフモードで実行している場合にはこの設定を ini_set() で変更することはできません。

ふむふむ。
セーフモードではmax_execution_timeは変更できん、と。

これは大事なことだな。



次にphpマニュアルでset_time_limit()をみた。
スクリプトが実行可能な秒数を設定します。 
この制限にかかるとスクリプトは致命的エラーを返します。 
デフォルトの制限値は 30 秒です。 
なお、php.iniでmax_execution_timeの 値が定義されている場合にはそれを用います。

この関数がコールされた場合、 タイムアウトカウンタをゼロから再スタートします。 
言いかえると、タイムアウトがデフォルトの 30 秒で スクリプト実行までに 25 秒かかる場合に、 set_time_limit(20) を実行すると、スクリプトは、 タイムアウトまでに全体で 45秒 の間実行されます。 
†PHPマニュアルよりhttp://www.php.net/manual/ja/function.set-time-limit.php

えーと、何も設定をしていなければデフォで30秒が適用されるってことね。


ここに、
「php.iniでmax_execution_timeの 値が定義されている場合にはそれを用います。」
とは書いてあるが、set_time_limit()よりそっちが強いとは一言も書いてない。


でもたぶん山田先生はこの、
"デフォルトの30秒より、php.iniのmax_exeution_timeの値が定義されている場合はそれを用いる"
ってのが言いたかったんだろうなあ。


いやでもあの文章じゃわからんて。



それにしてもタイムアウトカウンタの動きが面白いなあ。
スクリプト実行までに25秒かかる状況ってのが想像できんけど。

通信状態が悪かったりとかかね。






まあ結論。

set_time_limit()で普通にphp.iniの設定を上書きできる
念のためini_set('max_execution_time', 0)も試したけど結果は同じだった。



山田先生、ちゃんとわかるように書いて下さい(_ _)
普通に勘違いしちゃったよ。




ちなみに試した環境はPHP5.3.0であって、PHP4では試してない。
もしかしたらPHP4の環境であればset_time_limit()を記述していてもphp.iniの設定が勝つ結果になるのかもしれない。



ならんと思うが