Microsoft Azure WebサイトにおけるEC-CUBEの最適化 でも取り上げた内容ですが、 IIS では FastCGI を実行する場合、標準で出力バッファリングが有効になっています。
ResponseBufferLimit - FastCGI プロセスによって処理されたデータは、応答としてクライアントに返されるまでバッファーに格納されます。このプロパティでは、このアプリケーションへの要求をバッファーに格納する応答データの量をバイト単位で指定します。バッファーがいっぱいになるか、応答が完了するかのどちらかが最初に起こったとき、このバッファーはクライアントにフラッシュされます。
このため、PHP側で ob_flush() などをコールして出力をフラッシュしたり、 ob_end_clean() などで出力バッファリングを無効にしてもIIS側でのバッファリングがフラッシュされません。
flush() 関数のコメント にも記載されていますが、 IIS 側の設定で出力バッファリングを無効にしてやる必要があります。
以下のように web.config に記載し responseBufferLimit=0 をハンドラーマッピングに設定します。
Windows Azure Websites での設定例です。 ローカルマシンの場合は scriptProcessor のパスなどを適宜修正してください。
<configuration>
<system.webServer>
.....
<handlers>
<remove name="PHP53_via_FastCGI" />
<add name="PHP53_via_FastCGI" path="*.php" verb="GET,HEAD,POST" modules="FastCgiModule" scriptProcessor="D:\Program Files (x86)\PHP\v5.3\php-cgi.exe" resourceType="Either" requireAccess="Script" responseBufferLimit="0"/>
</handlers>
</system.webServer>
</configuration>