php文件开头的字符(ef bb bf)是utf-8 bom残留,由编辑器如windows记事本、旧版notepad++或sublime text以“utf-8 with bom”保存所致,php将其视为前置输出,导致headers already sent等错误。

PHP文件开头出现字符(EF BB BF)是BOM残留
不是代码写错了,是文件保存时被编辑器悄悄加了三个不可见字节 EF BB BF。Windows记事本、某些旧版Notepad++或Sublime Text默认用“UTF-8 with BOM”保存,PHP会把它当普通输出——哪怕你只写了<?php echo 'hello';,开头也先吐出这三个字节。
怎么确认是不是BOM而不是乱码
别信编辑器右下角显示的“UTF-8”,它只是猜测。真正验证方法只有两个:
- 命令行执行:
head -c 3 your_file.php | xxd,输出00000000: efbb bf就坐实了 - 在VS Code里按
Ctrl+Shift+P→ 输入 “Reopen with Encoding” → 依次选UTF-8、UTF-8 with BOM、GBK,看哪一种让中文正常显示且开头没怪字符
PHP脚本里用substr()清除BOM最稳妥
批量处理时别依赖正则或str_replace(),BOM只可能出现在开头,且必须严格匹配前3字节。用pack()比硬写"\xEF\xBB\xBF"更可靠,避免转义歧义:
function removeBom($file) {
$content = file_get_contents($file);
if (substr($content, 0, 3) === pack('CCC', 0xef, 0xbb, 0xbf)) {
file_put_contents($file, substr($content, 3));
}
}
注意:这个函数必须在header()、session_start()之前调用,否则BOM已随响应体发出,再删也没用。
include的配置文件带BOM会导致整个项目崩溃
BOM问题常藏在你看不见的地方:
-
require 'config.php';—— 如果config.php带BOM,主脚本header()立刻报错 -
vendor/autoload.php被Composer生成时一般安全,但手动改过的第三方库文件可能带BOM - 用
ob_start()能暂时掩盖,但JSON接口、文件下载、AJAX返回仍会出错,因为BOM污染的是原始字节流
真正麻烦的不是单个文件,而是那个被require了十几次、放在子目录三层深、名字叫db.inc的配置文件——它带BOM,会让所有依赖它的脚本都悄无声息地坏掉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











