LoginSignup
7

More than 5 years have passed since last update.

IIS で PHP の ob_* 関数が効かない場合の対処法

Posted at

Microsoft Azure WebサイトにおけるEC-CUBEの最適化 でも取り上げた内容ですが、 IIS では FastCGI を実行する場合、標準で出力バッファリングが有効になっています。

ResponseBufferLimit - FastCGI プロセスによって処理されたデータは、応答としてクライアントに返されるまでバッファーに格納されます。このプロパティでは、このアプリケーションへの要求をバッファーに格納する応答データの量をバイト単位で指定します。バッファーがいっぱいになるか、応答が完了するかのどちらかが最初に起こったとき、このバッファーはクライアントにフラッシュされます。

IIS 6 用 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>

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7