PHP header already sent:中文乱码、BOM、空格导致的全套解决方案(图文版)

你是不是也遇到过这个经典报错:

vbnet 复制代码
Warning: Cannot modify header information - headers already sent by...

中文名就叫:

"还没来得及发 HTTP 头,你就先输出东西了"

别慌,这绝对不是大问题,但也是 PHP 新手最容易踩的坑。

今天我用最简单的方式,带你把这个问题彻底讲懂。


1⃣ 这个错误到底什么意思?

一句话解释:

你调用 header()setcookie()session_start() 之前,

代码里已经"悄悄输出了一些东西"。

这些"输出"可能是:

  • 一个看不见的空格
  • 一个回车符
  • 隐藏的 BOM 字节
  • 你自己 echo/var_dump 的内容
  • 引入文件里的输出

只要有一点点输出,header 就会报错。


2⃣ 最常见的罪魁祸首:UTF-8 BOM

很多编辑器默认保存为"UTF-8 BOM",而 PHP 最怕 BOM。

BOM 会在文件最开头偷偷输出三个字节:

复制代码
EF BB BF

你看不见,但服务器能看到。

于是服务器说:

"啊你已经输出了,我就不能设置 header 了。"


✔ 如何判断文件是不是 BOM?

症状明显:

  • 中文突然乱码
  • header 报错特别早
  • 新建文件使用过 Windows 记事本 / Dreamweaver

✔ 如何去掉 BOM?

VSCode

右下角 → 点击"UTF-8" → 选择 UTF-8(无 BOM) 保存即可。

Notepad++

菜单 → 格式 → 选择 UTF-8(无 BOM)

宝塔面板编辑器 / PHPStorm

默认不会带 BOM,比较安全。


3⃣ 第二大元凶:文件顶部的空格 + 回车

PHP 文件头部常见两种错误:

❌ 错误写法 1:

php 复制代码
(空格)(空格)
<?php

❌ 错误写法 2:

php 复制代码
<?php

// 顶部多了一行空行

这两个都会导致 header 报错。


✔ 正确写法

php 复制代码
<?php

第一行第一列必须是 <?php,上面不能有任何内容。

记住:
空格也算输出!回车也算输出!


4⃣ 第三类:你自己输出的调试信息

最容易忘的情况:

scss 复制代码
var_dump($data);  
header("Location: /index.php");

你调试一下忘记删了,header 直接挂掉。

其它输出包括:

  • echo
  • print
  • print_r
  • die
  • exit

都要检查一遍。


5⃣ include/require 的文件里也可能有输出

主文件可能没问题,但你这样写:

javascript 复制代码
require 'config.php';
header("Location: xxx.php");

只要 config.php 有:

  • BOM
  • 空格
  • echo
  • HTML

都会导致 header 报错。

记得 所有被引入的文件也要检查


6⃣ 万能解决方案:输出缓冲(最稳)

如果你实在搞不清哪里输出了,可以直接使用:

scss 复制代码
ob_start();

把它放在所有代码最上方。

PHP 会把所有输出暂存,

等你把 header / cookie / session 都设置完,

再统一输出。


7⃣ 最稳定推荐写法(复制就能用)

php 复制代码
<?php
ob_start();
session_start();
header("Content-Type: text/html; charset=utf-8");

// 你的逻辑...

这套写法能避免 99% 的 "header already sent"。

9⃣ 最后给你一个超实用排查顺序(收藏版)

  1. 检查文件顶部是否有空格/空行
  2. 转成 UTF-8 无 BOM
  3. 搜索所有 output(echo/print/var_dump)
  4. 检查 include 的文件
  5. 统一加 ob_start()
  6. 不行再检查 CDN 或 gzip(非常少见)

按这顺序查,10 分钟必解决。

相关推荐
帅那个帅25 分钟前
PHP里面的抽象类和接口类
开发语言·php
Blossom.11815 小时前
大模型推理优化实战:连续批处理与PagedAttention性能提升300%
大数据·人工智能·python·神经网络·算法·机器学习·php
编程大师哥17 小时前
Boost C++
java·c++·php
fiveym19 小时前
PXE启动菜单配置完全指南:打造高效网络装机入口
开发语言·网络·php
fiveym19 小时前
PXE装机遇DHCP错误:ICMP echo reply导致IP分配失败原理解析
网络协议·tcp/ip·php
BingoGo21 小时前
使用 PHP 和 WebSocket 构建实时聊天应用:完整指南
后端·php
JaguarJack21 小时前
使用 PHP 和 WebSocket 构建实时聊天应用 完整指南
后端·php
LCG米1 天前
基于LoRa的远距离低功耗农业传感器网络设计与实现(SX1278+STM32L071)
网络·stm32·php
ai_xiaogui1 天前
Debian系统PVE虚拟机安装详解:ISO镜像上传+硬件配置+图形化安装指南
运维·debian·php·panelai兼容测试·图形化安装指南·iso镜像上传配置·debian pve虚拟机安装
梦想要有1 天前
盲盒无限功能分享
php