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

PHP BOM 頭導致 "Headers already sent" 錯誤的排查與解決

     編輯:PHP 相關知識

錯誤現場

Cannot modify header information - headers already sent by ...

在 setcookie() 前輸出任何內容(含空白字符)都會觸發此錯誤。但明明代碼頂部無輸出,為何仍報錯?

排查過程

  1. 嘗試 ob_start() + ob_get_clean() 捕獲輸出 → 發現輸出為空字符串
  2. 用 Vim 打開源文件 → 發現 bomb 選項開啟
  3. 關閉 BOM::set nobomb → 問題解決

BOM 是什麼?

Byte Order Mark (BOM):文件開頭的隱藏字節標記編碼(UTF-8 為 EF BB BF)。

  • 優點:編輯器可自動識別編碼
  • 缺點:PHP 不識別 BOM,會將其作為輸出內容發送給瀏覽器,導致 Header 提前發送

解決方案

方法一:編輯器移除(推薦)

  • Vim::set nobomb → 保存
  • VS Code:右下角編碼選單 → "Save without BOM"
  • Notepad++:編碼 → "UTF-8 (無 BOM)"
  • PhpStorm:File → File Encoding → 去除 BOM

方法二:代碼層面兼容(治標不治本)

<?php
// 入口文件最頂部
if (substr($content, 0, 3) === pack('CCC', 0xEF, 0xBB, 0xBF)) {
    $content = substr($content, 3);
}
// 或使用 ob_start() 緩衝輸出
ob_start();
?>

最佳實踐

  1. 專案規範:全項目強制使用 UTF-8 無 BOM 編碼
  2. 編輯器配置:統一團隊編輯器默認保存為無 BOM
  3. Git 攔截:pre-commit hook 檢測並拒絕含 BOM 文件
  4. 部署檢查:CI 流程中掃描 grep -r $'\xEF\xBB\xBF' .

一個隱形的 BOM,能讓整個項目集體「頭痛」。養成無 BOM 習慣,是 PHP 開發者的基本功。

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