在寫PHP程式的時候常常遇到這個問題;
包含使用header()函數,使用session()函數、cookies函數都有可能出次問題
PHP程式報如下錯誤:
Cannot modify header information - headers already sent by (output started at
不能夠修改header infomation ,要解決這個錯誤需要明白兩點問題。
第一,http協議
在http協議中,伺服器向瀏覽器端輸出html文件, html檔案由兩部分組成,一部分是我們頁面本身的數據,還有一部分就是html頁面的頭信息,這些信息包含很多數據,如頁面以何種編碼格式顯示、html數據大小、是否跳轉、是否緩存等等。緩存,一是程式緩存,我理解為程式在記憶體中的資料緩存;二是PHP提供的快取模組,透過這個模組,PHP會另外在開闢一塊地方作為資料的緩存,如果PHP模組快取開啟,則當程式中有echo資料的時候,資料被放入快取中,而不是直接產生HTML文件,直到PHP程式運行完畢,再把模組快取的資料一併產生HTML程式碼,包含頭檔。
1.快取未開啟(預設是這樣的)
<?php echo "123"; header("Content-type:text/html;charset=utf-8") echo "456"; ?>
這時候曝出Cannot modify header information 錯誤;
2. 開啟快取機制reee在上述兩個例子中,未開啟快取狀態,未開啟快取機制
在上述兩個例子中,未開啟快取狀態,未開啟快取狀態當echo "123"; 的時候已經產生一份HTML程式碼, 到第三行的時候header函數就不能修改頭文件信息,報錯; 在例子2中ob_start() ; 開啟緩存,(ob是output_buffer),當echo "123" 時候資料寫入到快取模組中, 然後header()函數運行,此時並未產生HTML頁面,然後echo "456";也是輸出到快取模組,當程式執行完畢後,快取模組的數據再產生完整的HTML頁面,這樣就不報錯了。的,如果必要的話,可以修改php.ini文件,找到output_buffering 選項,修改為output_buffering = 4096 (On也行),數字代表快取大小。 PHP快取機制還有一些函數,大家可是試試,能更好的理解PHP快取機制ob_start() 開始輸出緩衝, 這時PHP停止輸出, 在這以後的輸出都被轉到一個內部的緩衝裡.
ob_get_contents() 這個函數回傳內部緩衝的內容. 這等於把這些輸出都變成了字串. ob_get_ length() 傳回內部緩衝的長度. ob_get_ length() 返回內部緩衝的長度. 並且輸出緩衝裡的內容. 在這以後的輸出都是正常輸出. ob_end_clean() 結束輸出緩衝, 並扔掉緩衝裡的內容.