ob_flush()
和flush()
之間有什麼區別,爲什麼我必須同時調用?PHP緩衝區ob_flush()與flush()
此功能將發送輸出緩衝區(如果有的話)的內容。
刷新PHP程序的寫緩衝器,無論後端PHP使用(CGI,web服務器等)。
然而,繼續說:
[它]可能無法覆蓋您的Web服務器的緩存模式...
所以,在我看來,我可以一直使用ob_flush()
。但是,當我這樣做時,我會得到奇怪的結果。有人能夠簡單地解釋這裏發生了什麼?
ob_flush()
和flush()
之間有什麼區別,爲什麼我必須同時調用?PHP緩衝區ob_flush()與flush()
此功能將發送輸出緩衝區(如果有的話)的內容。
刷新PHP程序的寫緩衝器,無論後端PHP使用(CGI,web服務器等)。
然而,繼續說:
[它]可能無法覆蓋您的Web服務器的緩存模式...
所以,在我看來,我可以一直使用ob_flush()
。但是,當我這樣做時,我會得到奇怪的結果。有人能夠簡單地解釋這裏發生了什麼?
ob_flush
發送應用程序啓動的緩衝區。在任何PHP腳本中可能有多個嵌套的ob_start()
。 ob_flush
將當前內容傳遞給上層。
PHP本身可能(根據自己的判斷)緩衝輸出。這取決於後端。但通常FastCGI
自己有一個套接字緩衝區。因此需要調用flush()
以將當前內容發送到Web服務器。
現在網絡服務器本身可能會實現另一個緩衝方案(mod_deflate
或內容過濾器),這對您沒有影響。但這很少,因爲它需要專門配置。
無論如何,使用兩者。
ob_flush
刷新你一個函數創建像緩衝PHP腳本本身的輸出到它的調用者
我想這是關於您previous questionob_start
flush
刷新輸出緩衝器。使用輸出緩衝的重要優勢在於它與數據壓縮一起使用。如果你沒有使用ob_gzhandler
,那麼收益不大。 flush
獨自將承諾任何輸出數據仍在服務器上。隨着ob_start
及其同行ob_flush
,ob_end_clean
和ob_end_flush
,無論是等待被壓縮(看看flush
和ob_flush
爲是指不同的桶 - ob
將數據發送到flush
,flush
將數據發送到瀏覽器 - 可能不準確,但是這想法)將被包裝併發送給客戶。
謝謝,水桶比喻是一個很好的例子。 – Ben 2010-11-16 06:56:13
ob_flush()
是高級別刷新。它刷新高級緩衝區,並將所有內容放入低級內部緩衝區,以準備發送。
ob_
系列函數創建棧緩衝區,所以只是一味地寫ob_flush()
到處確實想給你「奇怪的結果」如果代碼被寫入藉此堆積的優勢。flush()
是一個低級flush,指示PHP刷新其內部的低級別數據緩衝區。
下面還有套接字層緩衝區;在那之下,有網絡層緩衝區。而且,在最低的層面上,電子隊列沿着數據電纜走下去。
使用ob_flush並刷新並按順序使用它們。 – Robino 2013-06-17 19:09:04
這個答案中缺少的重要細節是['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