首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP "Cannot modify header information" 錯誤徹底解決指南

     編輯:PHP 綜合知識

錯誤本質

`Warning: Cannot modify header information - headers already sent by ...` 表示 **HTTP 頭部已發送**,隨後嘗試調用 `header()`、`setcookie()`、`session_start()` 等發送頭部的函數失敗。

HTTP 協議規定:**頭部必須在內容主體之前發送,且只能發送一次**。任何輸出(`echo`、HTML 空白、BOM、錯誤信息)都會導致 PHP 發送頭部並開始輸出主體。

最常見的 5 大原因

原因典型代碼解決方案
文件開頭有空白/換行/BOM`刪除空白;用編輯器「另存為無 BOM UTF-8」
header/setcookie/session_start 前有輸出`echo '...'; header('Location:...');`移動頭部操作到**所有輸出之前**
包含文件輸出了內容`include 'config.php';` 文件末尾有 `?>` 後空白**純 PHP 文件省略結束標籤 `?>`**
錯誤/警告輸出`Warning: include(...)` 在 header 前開發環境顯示錯誤,生產環境 `display_errors=Off` + `log_errors=On`
Session 自動啟動輸出`session.auto_start = On` 且輸出在前關閉 `session.auto_start`,手動控制 `session_start()` 位置

三大核心解決方案

方案一:輸出緩衝 —— 最通用、改動最小

在腳本**最頂部**(`

  • **原理**:緩衝區激活時,PHP 不直接發送輸出到瀏覽器,頭部操作可隨時插入。
  • **配置替代**:`php.ini` 設置 `output_buffering = On` (或具體大小如 `4096`),全局生效,無需改代碼。
  • **注意**:緩衝會增加內存佔用,超大輸出(如文件下載)需分段 `ob_flush()`。

方案二:代碼結構重組 —— 根治、最佳實踐




頁面




  • **原則**:**「先處理,後輸出」**。模板引擎、MVC 框架天然符合此模式。
  • **純 PHP 文件(類、配置、工具)**:**絕對不要寫結束標籤 `?>`**,防止後續空白輸出。

方案三:移除 BOM —— 隱形殺手

  • **現象**:文件編碼為 UTF-8 with BOM,文件開頭隱藏 3 字節 `EF BB BF`,導致直接輸出。
  • **檢測**:`xxd file.php | head` 或 Notepad++「編碼」菜單查看。
  • **修復**:Notepad++ → 編碼 → 轉為 UTF-8 (無 BOM) / VS Code → 右下角編碼 → Save with Encoding → UTF-8。

進階排查技巧

特殊場景對策

場景對策
文件下載先 `header()` 設置類型/離線名,再 `readfile()`/`echo` 內容;大文件用 `ob_end_clean()` 清除前序緩衝
AJAX 返回 JSON確保 `header('Content-Type: application/json')` 在任何 `echo`/`print` 前;框架通常自動處理
重定向後仍有代碼執行`header('Location: ...'); exit;` **必須跟 `exit`/`die`**,否則腳本繼續執行可能輸出
Composer 自動加載器輸出檢查 `vendor/autoload.php` 末尾無 `?>` 及空白;正規包無此問題

總結檢查清單

  1. ✅ 文件無 BOM、無 `
  2. ✅ 純 PHP 文件**省略 `?>`**。
  3. ✅ `header`/`setcookie`/`session_start` 在**任何 `echo`/`print`/HTML 前**。
  4. ✅ 生產環境 `display_errors = Off`,錯誤寫日誌不輸出頁面。
  5. ✅ 如難以重構,頂部加 `ob_start()` 或 `php.ini` 開 `output_buffering`。

遵循「先邏輯後輸出」、杜絕 BOM、善用緩衝,徹底告別 headers already sent 錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved