2013-05-01 54 views
3

此代碼:是否故意讓php認爲在ob_end_flush()調用之後有一些輸出?

ob_start(); 
ob_end_flush(); 

header('foo'); 

拋出警告

Warning: Cannot modify header information - headers already sent 

,而這一點:

echo ''; 
header('foo'); 

沒有。

我看不出他們之間有任何顯著差異。

那麼,這種行爲預期或不?

PS:PHP 5.3.2

+0

你試過了更先進的最新版本的PHP? 5.3.10顯然沒有做到這一點:http://codepad.viper-7.com/PBuzbY – Ryan 2013-05-01 04:28:46

+0

@rynah:運行'的phpinfo()'那裏 - 它'output_buffering \t 4096' – zerkms 2013-05-01 04:29:59

+0

我沒有得到與PHP錯誤5.3.6 – Amir 2013-05-01 05:29:33

回答

3

My initial reaction這是「這是我所期望的行爲」,但它turns out有一些微妙之處在於你所使用的PHP版本。

首先我們要介紹爲什麼我的第一反應是這是什麼,因爲(因爲you are using 5.3)它適用於你的測試:

ob_end_flush()隱式調用flush(),推頭到瀏覽器,無論任何內容是否已經產生。
echo '';,另一方面基本上是一個NOOP - 你問的引擎做什麼,所以什麼也沒發生。

然而,多一點調查顯示,implicit_flush option爲OB其實關閉默認情況下,所以這不應該事實上任何區別,除非你已啓用選項明確。

而且,這種行爲是不5.2.2之前或5.4.0+看到 - 所以我的下一個停靠港是與this比較this。即使你根本看不懂C語言,但顯然5.3和5.4中的輸出處理之間存在巨大差異 - 發生了相當大的重寫。

由於現實生活中的承諾,我還沒有把它適當地分開,並找到這個具體問題相關的關鍵代碼,但我會很快這樣做,並在此答案擴大時,我已經這樣做了。


摘要:

  • 根據您的PHP版本和配置,這可能很可能是合乎邏輯的和預期的行爲。
  • 在PHP版本重的差異使這個問題有更多的只是一個簡單的答案
相關問題