phpのタイムアウトに関して
問題
phpって30秒(max_execution_time)経つとタイムアウトしてfatal error で終了するんですよね?
答え
純粋にスクリプト実行時間でタイムアウトするらしい。
実行開始からの経過時間ではなく。
system()、sleep()、ストリーム操作、SQL実行中など、スクリプトが何もしないで待ちになる時間は含まない。
だから、データベース側が遅くて…とかどこかのWebAPIのレスポンスが遅くて… という場合は、タイムアウトにならない。
↓これを実行すると、1秒ではなく、100秒きちんと実行して、エラーなく終了する。
set_time_limit(1); for ($i = 0; $i < 100; ++$i) { sleep(1); echo $i . '|'; }
ループ中のsleep(1)はタイムアウトの勘定に入らない。
sleep(1)以外の時間(= echoなどの時間)は一瞬で、100回程度繰り返しても1秒にならない
→タイムアウトにならない
上の処理も、x00万回ぐらいループさせれば、スクリプトの実行時間が1秒に到達してタイムアウトします。
ということは、複雑な演算をさせるわけでもない普通のプログラムでは、無限ループ以外の手段でタイムアウトを発生させるのは、結構難しいと言えそうです。
補足
ただしWindowsは普通の意味の始まってからの時間でタイムアウトするらしい。
【php】わざとタイムアウトを発生させる方法 at softelメモ 2010年1月14日 09:38
[…] phpのタイムアウトについて書いたとおり、sleep()や、ネットワークの待ち、データベースの返答待ちなどではタイムアウトを起こすことはできない(Windows環境を除く)。 […]