PHP 中的標頭已發送錯誤
執行PHP 腳本時,您可能會遇到以下錯誤:
Warning: Cannot modify header information - headers already sent by (output started at /some/file.php:12) in /some/file.php on line 23
當HTTP標頭已發送時,會發生這種情況產生任何輸出後嘗試發送/修改。 header()、setcookie() 和 session_start() 等函數要求在進行任何輸出之前發送標頭。
標頭已發送錯誤的原因
無意輸出:
- UTF-8位元組順序標記(BOM)
- 之前的錯誤訊息或通知
有意輸出:
- print、echo 或其他產生輸出的函數
- 原始HTML部分
辨識輸出來源
錯誤訊息通常包含呼叫頭函數的行(例如第23行)和過早輸出的來源(例如行12).
解決方案
避免過早輸出:
- 使用函數和模板方案重建應用程式流程。
- 確保在寫入訊息或渲染輸出之前進行 header() 呼叫。
修正特定問題原因:
-
列印/回顯:使用trigger_error、ob_flush或var_dump等函數來管理輸出。
-
原始HTML:放置HTML 之前的表單處理與腳本條件
-
空格: 刪除前導空格或使用長PHP 標籤()而不是簡寫(=) 標籤。
-
UTF-8 BOM: 設定文字編輯器將檔案儲存為「UTF-8(無 BOM)」或使用十六進位編輯器刪除 BOM。
-
?>: 省略尾隨 PHP 關閉標籤。
-
其他: 檢查 PHP 擴充或 php.ini。可能會導致隱式輸出的ini設定。
-
錯誤訊息: 避免錯誤,延遲其執行,或使用 isset() 或 @() 抑制錯誤。
輸出緩衝(解決方法):
- 啟用輸出透過在 php.ini 中設定 output_buffering 或使用 ob_start() 進行緩衝。
- 使用ob_clean() 如果產生了二進位內容。
- 請注意,輸出緩衝不能取代正確的應用程式結構。
後備解決方法:
-
HTML 元標記: 注入
-
JavaScript 重新導向: 使用 location.replace() 或 location.href= 重新導向客戶端。
以上是為什麼我在 PHP 中收到「標頭已傳送」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!