2009-02-08 188 views
3

我寫一個PHP腳本和地方我header()功能之前,我已打印文本在此瀏覽器造成我header()功能給我一個衆所周知的錯誤:輸出緩衝區

Warning: Cannot modify header information - headers already sent.

現在的問題是,我有在header()函數之前和之後使用ob_start()ob_flush()的意圖。但是我曾經聽說過類似輸出緩衝區的東西會影響應用程序的性能。那是多麼真實?

或者我應該堅持打印Javascript功能重定向頁面的想法。

謝謝你的時間。

+1

我非常感謝你的時間和對我的問題的積極貢獻。現在我明白了更好的東西,尤其是輸出緩衝區讓我困惑了一陣子。在所有的帖子後,我一直可以用正確的方法來。感謝你們,你們都爲我省了很多心思。 – 2009-02-08 23:14:59

回答

4

使用的輸出緩衝器需要服務器來存儲PHP的整個輸出在RAM中,所以如果它是一個大頁面,你將使用相當數量的內存結束 - 而且服務器也必須等到整個頁面生成才發送出去,這可能會導致一個小的延遲。但除此之外,我不認爲在使用輸出緩衝區方面有很多缺點。對於你想要做的,這當然是一個合理的解決方案。

+0

+1表示在調用ob_flush()之前數據未流式傳輸,這會導致加載時間變慢(但不是必需的較慢生成時間)。 – strager 2009-02-08 21:02:55

+0

我有一個關於這個話題的問題,我可以與你[這裏](http://chat.stackoverflow.com/rooms/83235/room-for-sajad-and-david-z)? – Shafizadeh 2015-07-14 15:59:57

5

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.

測試ob_start和朋友看看是否性能差異很重要。如果是這樣,尋找替代品。

最簡單的選擇是在打印前移動header()呼叫。

正如你可能喜歡的東西進行重新定位:

header('Location: /new/location/'); 

你不應該這樣header()調用之前打印任何東西,因爲客戶不會跟你反正打印的數據什麼(除非有件事情我我錯過了HTTP)。

(JavaScript是不是重定向一個很好的選擇,而且也不是meta清爽,除非你想檢測的Javascript出於某種原因。)

0

只是回答你的最後一句話:你可以在PHP中使用header('Location: '.$url)任何其它輸出之前,應該去明顯的重定向頁面,並建議應遵循exit();

+0

這是他的問題,他已經打印輸出。 – 2009-02-08 21:01:30

2

在PHP代碼後輸出可以說不好的重新定位應用設計。 但我不知道你的情況,可以提出兩種可能的方法。

  1. 將代碼拆分爲模型(數據處理)和查看(輸出)(請參見MVC)。這意味着即使在顯示任何內容之前,您也正在做出重新定位的決定。我會這樣稱呼這種方式。
  2. 如果你真的需要顯示輸出(或發送其他頭),常見的方式是結合JS和HTML(在無腳本):

    if (headers_sent()) { 
        print('<script type="text/javascript">(document.location.replace) ? document.location.replace("'.$location.'") : document.location.href = "'.$location.'";</script>'."\n".'<noscript><meta http-equiv="Refresh" content="0;URL='.$location.'" /></noscript>'); 
    } else { 
        header('Location: '.$location); 
        exit; 
    } 
    

附:該代碼是一個Fusebox框架。