システムバッファのフラッシュ
PHP は、システムバッファをフラッシュ(内容を送信して破棄) する方法をふたつ提供します: flush() と、 ob_implicit_flush() や php.ini 設定 implicit_flush 経由で暗黙のフラッシュを有効にする方法です。
出力をフラッシュする動作
暗黙のフラッシュを無効にすると、 PHP は flush() をコールしたときか、 スクリプトが終了したときにだけ出力をフラッシュします。
暗黙のフラッシュを有効にすると、 PHP は出力を生成するコードブロックが終了するたびに、 フラッシュを実行しようとします。 このコンテクストにおける出力は、以下に示す長さが 0 より大きなデータです:
-
<?php ?>
タグの外側 - ユーザが提供した変数や文字列を出力することを明確な目的とした言語構造や関数による出力。 これにあてはまる言語構造や関数は、 echo, print, printf(), var_dump(), var_export(), vprintf() です。
- 実行中のスクリプトや PHP に関するデータ/情報を収集し、 出力することを目的とした関数による出力。 これにあてはまる関数は、 debug_print_backtrace(), phpcredits(), phpinfo(), ReflectionExtension::info() です。
- 捕捉されなかった例外や、処理されなかったエラーが発生したときに PHP が行う出力。 (出力されるかどうかは、 display_errors と error_reporting の設定次第です)
-
php://output
に書き込まれたあらゆるデータ
注意: 空文字列やヘッダの送信は、出力とはみなされないので、 フラッシュは発生しません。
暗黙のフラッシュが有効な場合、制御文字
(例: "\n"
, "\r"
,
"\0"
) もフラッシュを発生させます。
制限事項
この機能は、ユーザレベルの出力バッファをフラッシュできません。 ユーザレベルの出力バッファを一緒にフラッシュするには、 PHP が何らかの出力を生成するためにシステムバッファをフラッシュする前に、 ユーザレベルの出力バッファをフラッシュしなければなりません。
flush() をコールしたり、 暗黙のフラッシュを有効にすると、 Web のコンテキスト中でヘッダを設定して送信するユーザレベルの出力バッファのハンドラ(例: ob_gzhandler()) を邪魔する可能性があります。 これは、これらのハンドラがヘッダを送信する前に、フラッシュの動作がヘッダを送信することが原因です。
基礎となる ソフトウェア/ハードウェアによって実装されたバッファリングは PHP によって上書きできません。 よって、PHP のバッファ制御関数を使う際にはこの点を考慮する必要があります。 ウェブサーバー/ブラウザ/コンソールのバッファリング設定をチェックして使うことで、 起こりうる問題を軽減することができます。 Web のコンテキストで作業する場合、ウェブサーバーのバッファリング設定や スクリプトのバッファリングを一緒に調整することができます。 PHP スクリプトのバッファリングを調整することで、 さまざまなブラウザのバッファリング戦略を回避できます。 行バッファリングを実装しているコンソールでは、 改行文字を適切な場所に挿入してから出力をフラッシュします。
SAPI ごとのフラッシュの動作の違い
フラッシュの機能は、SAPI ごとに少し違ったやり方で実装されていますが、 以下の2つのカテゴリに分類できます:
-
Web のコンテキストで使われる SAPI は、
ヘッダをまずフラッシュし、その後に出力を続けます。
Apache2Handler
,CGI
,FastCGI
,FPM
がこうした SAPI に該当します。 -
出力をフラッシュするだけのその他の SAPI。
たとえば
CLI
とembed
が該当します。