2010-11-16 172 views
61

ob_flush()flush()之間有什麼區別,爲什麼我必須同時調用?PHP緩衝區ob_flush()與flush()

ob_flush() reference說:

此功能將發送輸出緩衝區(如果有的話)的內容。

flush() reference說:

刷新PHP程序的寫緩衝器,無論後端PHP使用(CGI,web服務器等)。

然而,繼續說:

[它]可能無法覆蓋您的Web服務器的緩存模式...

所以,在我看來,我可以一直使用ob_flush()。但是,當我這樣做時,我會得到奇怪的結果。有人能夠簡單地解釋這裏發生了什麼?

回答

62

ob_flush發送應用程序啓動的緩衝區。在任何PHP腳本中可能有多個嵌套的ob_start()ob_flush將當前內容傳遞給上層。

PHP本身可能(根據自己的判斷)緩衝輸出。這取決於後端。但通常FastCGI自己有一個套接字緩衝區。因此需要調用flush()以將當前內容發送到Web服務器。

現在網絡服務器本身可能會實現另一個緩衝方案(mod_deflate或內容過濾器),這對您沒有影響。但這很少,因爲它需要專門配置。

無論如何,使用兩者。

+6

使用ob_flush並刷新並按順序使用它們。 – Robino 2013-06-17 19:09:04

+12

這個答案中缺少的重要細節是['output_buffering'](http://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering)配置選項,其默認值在生產中這意味着當任何PHP腳本啓動時,輸出的前4096個字節被緩衝(在用'ob_flush()')可沖刷的緩衝區中)。這就是爲什麼有必要使用'ob_flush()'和'flush()'。通過php.ini禁用'output_buffering'或在腳本開頭調用'ob_end_clean()'或'ob_end_flush()'可以消除這種必要性。 – 2014-05-25 23:04:24

26

ob_flush刷新一個函數創建像緩衝PHP腳本本身的輸出到它的調用者

10

我想這是關於您previous questionob_start

flush刷新輸出緩衝器。使用輸出緩衝的重要優勢在於它與數據壓縮一起使用。如果你沒有使用ob_gzhandler,那麼收益不大。 flush獨自將承諾任何輸出數據仍在服務器上。隨着ob_start及其同行ob_flushob_end_cleanob_end_flush,無論是等待被壓縮(看看flushob_flush爲是指不同的桶 - ob將數據發送到flushflush將數據發送到瀏覽器 - 可能不準確,但是這想法)將被包裝併發送給客戶。

+0

謝謝,水桶比喻是一個很好的例子。 – Ben 2010-11-16 06:56:13

18

ob_flush()是高級別刷新。它刷新高級緩衝區,並將所有內容放入低級內部緩衝區,以準備發送。

  • 注意,ob_系列函數創建棧緩衝區,所以只是一味地寫ob_flush()到處確實想給你「奇怪的結果」如果代碼被寫入藉此堆積的優勢。

flush()是一個低級flush,指示PHP刷新其內部的低級別數據緩衝區。

下面還有套接字層緩衝區;在那之下,有網絡層緩衝區。而且,在最低的層面上,電子隊列沿着數據電纜走下去。