83

ob_flush()との違いは何flush()ですか?なぜ両方を呼び出さなければならないのですか?

ob_flush()参照は言う:

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

flush()参照は言う:

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

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

[それは]あなたのウェブサーバーのバッファリングスキームを無効にすることができないかもしれません…</p>

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

4

4 に答える 4

76

ob_flush sends an application-initiated buffer. There may be multiple nested ob_start()'s in any PHP script. ob_flush passes the current content to the upper layer.

PHP itself might (at its own discretion) buffer output. This depends on the back-end. But usually FastCGI has a socket buffer on its own. Therefore flush() needs to be invoked as well to send the current content to the web server.

And now the web server might itself implement another buffering scheme (mod_deflate or content filter), which you have no influence over. But this is seldom, as it needs to be configured specifically.

Anyway, use both.

于 2010-11-16T05:18:54.110 に答える
35

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

flushPHPスクリプト自体のバッファリングされた出力をその呼び出し元にフラッシュします

于 2010-11-16T05:30:56.270 に答える
26

ob_flush()ハイレベルフラッシュです。高レベルのバッファをフラッシュし、すべてのコンテンツを低レベルの内部バッファに入れ、送信できる状態にします。

  • ob_関数のファミリはバッファのスタックを作成することに注意してくださいob_flush()。コードがこのスタックを利用するように書かれている場合、どこにでもやみくもに書き込むだけで、実際に「奇妙な結果」が得られることに注意してください。

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

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

于 2011-05-21T14:39:56.580 に答える
12

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

于 2010-11-16T05:49:06.983 に答える