解決 PHP 錯誤: Headers already sent

在 PHP 有一種很常見的 Warning 錯誤是 headers already sent, 出現時類似這樣:

Warning: Cannot modify header information – headers already sent by (output started at /path/to/file.php:20) in /path/to/file on line 23

這是在使用 session, setcookie 或 header 前, 有輸出內容所致, 輸出的不一定是文字, 可以是空格或空行。所以解決方法是將這些函數前的網頁輸出移除, 或者放在以上函數後便可以。

例如要用 PHP 的 header() 函數來轉址, 寫法是這樣:

以上程式碼會將網頁轉址到 http://www.phpini.com/, 但如果在 header() 函數前有輸出內容, 便會出現錯誤:

以上程式碼, 由於在 header() 函數前有用 echo 印出”Hello World!”, 所以會出現 “headers already sent” 錯誤。再看另一個例子:

以上 PHP 程式碼雖然 header() 函數前沒有 echo 或 print, 但由於已經有 HTML 輸出, 所以同樣會出現 “headers already sent” 錯誤。

要解決以上錯誤, 最簡單是將 header() 函數放到網頁輸出前面。

另一個方法是使用 ob_start(), 在檔案開頭加上 ob_start(), 及最後加上 ob_end_flush(), 例如:

除了修改 PHP 程式碼外, 還可以修改 php.ini 設定, 開啟 php.ini 檔案, 找到 “output_buffering” 一行, 預設是 Off, 改成 On 後重新啟動 Apache 便可以了。




Leave a Reply