web-dev-qa-db-ja.com

PHP buffer ob_flush()vs. flush()

ob_flush()flush()の違いは何ですか?なぜ両方を呼び出す必要がありますか?

ob_flush() reference の意味:

この関数は、出力バッファーの内容(存在する場合)を送信します。

flush() reference の意味:

PHPおよびバックエンドPHP=が使用しているもの(CGI、Webサーバーなど)の書き込みバッファをフラッシュします。

しかし、それは言い続けています:

[それは]あなたのウェブサーバーのバッファリングスキームを上書きできないかもしれません…

だから、私は常にob_flush()を使うことができるように思えます。しかし、そうすると奇妙な結果が得られます。誰かがここで何が起こっているのか簡単な言葉で説明できますか?

74
Ben

ob_flushは出力バッファをフラッシュしますyoob_startのような関数で作成されました

flushは、PHPスクリプト自体の呼び出し元にバッファーされた出力をフラッシュします

32
Dan Grossman

ob_flush()は高レベルのフラッシュです。高レベルバッファをフラッシュし、すべてのコンテンツを低レベルの内部バッファに入れて送信準備を整えます。

  • ob_ファミリの関数はstacksのバッファを作成するため、コードが書き込まれた場合、どこでも盲目的にob_flush()を書き込むだけで「奇妙な結果」が得られることに注意してください。このスタッキングを活用してください。

flush()は低レベルのフラッシュで、PHP内部の低レベルのデータバッファーをフラッシュするように指示します。

その下にも、ソケットレイヤーバッファーがあります。その下には、ネットワーク層バッファーがあります。そして、最低レベルでは、データケーブルを下る電子の列。

これは 前の質問 に関連していると思います。出力バッファリングを使用する重要な利点は、データ圧縮と併用する場合です。 ob_gzhandlerを使用していない場合、得られるものはほとんどありません。 flush単独では、まだサーバー上にある出力データをコミットします。 ob_startとそれに対応するob_flushob_end_cleanおよびob_end_flushを使用して、圧縮されるのを待っているもの(参照としてflushおよびob_flushを見てください)別のバケットに-obflushにデータを送信し、flushはブラウザにデータを送信します-正確ではないかもしれませんが、それはアイデアです)、ラップされてクライアントに送信されます。

11
bcosca