当前位置: 首页> 最新文章列表> 使用 headers_sent() 检查是否还能设置 header

使用 headers_sent() 检查是否还能设置 header

M66 2025-05-17

在 PHP 中,header() 函数用于发送原始的 HTTP 头部信息,比如重定向、设置 cookie、修改内容类型等。然而,HTTP 头部信息必须在任何实际输出(如 HTML、echo、print 等)之前发送,否则会引发错误。这是因为一旦输出开始,PHP 会自动发送 HTTP 头部。

为了避免调用 header() 时出错,我们可以使用 headers_sent() 函数来检测头部是否已经发送。

什么是 headers_sent()

headers_sent() 是 PHP 提供的一个内置函数,用来检查是否有 HTTP 头部信息已经发送到浏览器。它的基本用法如下:

if (!headers_sent()) {
    header('Location: https://m66.net/some-page');
    exit;
}

如果头部还没有发送,headers_sent() 返回 false,表示可以安全地调用 header();如果返回 true,说明头部已经发送,再调用 header() 就会报错。

检查具体发送位置

headers_sent() 还可以接受两个参数,用来获取头部输出的位置(文件和行号):

if (headers_sent($file, $line)) {
    echo "HTTP 头部已在 $file 文件的第 $line 行发送。";
} else {
    header('Location: https://m66.net/some-other-page');
    exit;
}

这种方式特别适合调试,帮助你找到提前输出的代码位置。

常见场景

1?? 页面重定向

在进行重定向之前,你应该确保没有任何输出:

if (!headers_sent()) {
    header('Location: https://m66.net/login');
    exit;
} else {
    echo "无法重定向,因为已经有输出。";
}

2?? 设置 cookie

同样,setcookie() 依赖 HTTP 头部,因此也要检查:

if (!headers_sent()) {
    setcookie('user', 'JohnDoe', time() + 3600, '/');
} else {
    echo "无法设置 cookie,因为头部已发送。";
}

小技巧:开启输出缓冲

如果你经常遇到头部发送错误,可以考虑在脚本开头启用输出缓冲:

ob_start();

这样所有输出会先进入缓冲区,而不是立刻发送给浏览器,直到脚本结束或调用 ob_end_flush(),给你留出更多时间来安全地发送头部信息。