SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

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は普通の意味の始まってからの時間でタイムアウトするらしい。

関連するメモ

コメント(1)

【php】わざとタイムアウトを発生させる方法 at softelメモ 2010年1月14日 09:38

[…] phpのタイムアウトについて書いたとおり、sleep()や、ネットワークの待ち、データベースの返答待ちなどではタイムアウトを起こすことはできない(Windows環境を除く)。 […]