ブラウザの通信の切断は CGI の処理中断につながるか?

HTTP でサーバサイドプログラムの実行中に通信が切断された場合、
サーバサイドのプログラムがどうなるか?という疑問から
PHP 4.4.X + Apache 2.0.X でちょっと実験してみました。

exp_timeout.php:
<?php
set_time_limit (0); // PHP の処理時間制限を無しに。
 
display(‘begin’);
for($i = 1; $i <= 100; $i++){ // 100 秒間処理をする。
  sleep(1);
display(($i*1).’%’);
}
 
display(‘end’);
 
// 表示&記録。
function display($mes){
   $line = date(‘Y-m-d H:i:s’).”: “.$mes.”<br>\n”;
   echo $line; // (*1)
   system(‘echo ‘.escapeshellarg($line).’>> result.html’);
   //flush(); ob_flush(); // (*2)
}
?>

この PHP スクリプトに Apache 経由でアクセスし、
レスポンスが返ってくるまでに HTTP クライアントのリクエストを中断させてみます。中断しても、result.html に結果が書かれるため、result.html にアクセスすることで処理がどこまで進んだか確認できます。
この検証を、(*1)、(*2)のコメントアウト, アンコメントアウトして行ってみました。
 
なお、PHP の設定についてはデフォルトで出力をバッファするものとします。
 
結果(コメントアウト状態を「なし」、コメントアウトを外した状態を「あり」と表記します):
– (*1)あり (*2)なし: 常に 100% まで完了。
– (*1)あり (*2)あり: 切断して数回出力した後に処理が中断。
– (*1)なし (*2)あり: 常に 100% まで完了。
– (*1)なし (*2)なし: 常に 100% まで完了。
 
 
考察:
HTTP 通信が切断された場合、HTTPレスポンス送信に規定回数失敗した時点で切断されたと認識され、スクリプトの処理が中断されるようです。
(*2), (*1)いずれかをコメントアウトした場合、処理完了まで一切出力を行わず、通信の切断を検知しないため、通常通り最後まで実行すると考えられます。
 
注:
この実験は、Apache 2.0 に限定したもので、仕様も一切あたらず行ったため、これ以外の HTTP サーバの場合に必ずしも同じ結果になるとは限りません。
 
捕捉:
処理時間を600秒など極端に長い時間にしてもタイムアウトすることなく動作を続けました。