headers already sent 错误是因为在调用 header()、session_start() 或 setcookie() 等函数之前,php 已经向浏览器发送了输出内容。解决该问题的最直接方法是使用输出缓冲控制(output buffering),通过开启 ob_start() 来拦截并暂存所有输出,直到脚本执行完毕或手动刷新缓冲区时再统一发送 http 头信息。

为什么会出现 Headers already sent 错误
HTTP 协议规定响应头必须在响应体之前发送。一旦 PHP 引擎遇到任何非头信息的输出(如 HTML 标签、空格、换行符或 echo 语句),就会立即将已收集的头部信息和这些输出发送给客户端。此时如果代码后续尝试修改头部信息,就会触发致命错误。常见触发场景包括文件开头的 BOM 字节序标记、HTML 标签前的空白字符,或者在包含文件中意外输出的内容。

<?php // 开启输出缓冲,防止早期输出导致头部发送失败
ob_start();
// 模拟一些早期输出,例如调试信息或 HTML 结构
echo "<html>";
// 此时设置 Cookie 或重定向依然有效,因为数据仍在缓冲区中
setcookie('user_id', '12345', time() + 3600);
header('Location: /dashboard');
// 输出剩余内容
echo "
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











