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