ZetCode

PHP headers_sent 函数

最后修改于 2025 年 4 月 4 日

PHP headers_sent 函数用于检查 HTTP 标头是否已发送。它有助于防止 Web 应用程序中的标头相关错误。

基本定义

headers_sent 确定是否已将标头发送到客户端。为了遵守正确的 HTTP 协议,标头必须在任何输出之前发送。

语法:headers_sent(string &$file = null, int &$line = null): bool。如果发送了标头,则返回 true,否则返回 false。可选参数显示发送位置。

基本标头检查

本示例展示了 headers_sent 的最简单用法。

basic_check.php
<?php

declare(strict_types=1);

if (!headers_sent()) {
    header('Location: https://example.com');
    exit;
}

echo "Headers already sent, cannot redirect";

此代码在尝试重定向之前检查标头是否已发送。如果标头已发送,则会显示错误消息,而不是执行重定向。

查找输出位置

本示例演示了如何使用 headers_sent 来查找输出的起始位置。

find_output.php
<?php

declare(strict_types=1);

echo "Some output before headers\n";

if (headers_sent($file, $line)) {
    echo "Headers sent in $file on line $line\n";
}

header('Content-Type: text/plain');

此代码显示了过早输出发生的位置。变量捕获了文件名和行号。这有助于调试大型应用程序中的标头相关问题。

条件性设置标头

本示例展示了如何根据 headers_sent 的返回值条件性地设置标头。

conditional_headers.php
<?php

declare(strict_types=1);

function safeHeader(string $header): bool {
    if (!headers_sent()) {
        header($header);
        return true;
    }
    return false;
}

safeHeader('X-Custom-Header: Value');

此包装函数在可能的情况下安全地设置标头。它返回操作是否成功。这种模式可以防止应用程序中出现与标头相关的警告。

使用 headers_sent 进行输出缓冲

本示例展示了输出缓冲与 headers_sent 的交互方式。

output_buffering.php
<?php

declare(strict_types=1);

ob_start();

echo "Content before headers\n";

if (!headers_sent()) {
    header('Content-Type: text/html');
    echo "Headers set successfully\n";
}

ob_end_flush();

输出缓冲会延迟发送标头,直到缓冲区刷新。这允许在输出之后仍然设置标头。缓冲区会收集输出,直到处理完毕。

使用 headers_sent 进行错误处理

本示例演示了在标头已发送时进行适当的错误处理。

error_handling.php
<?php

declare(strict_types=1);

echo "Accidental early output\n";

try {
    if (headers_sent($file, $line)) {
        throw new RuntimeException(
            "Headers already sent in $file on line $line"
        );
    }
    
    header('Cache-Control: no-cache');
} catch (RuntimeException $e) {
    error_log($e->getMessage());
    // Fallback behavior
}

此代码展示了针对标头问题的结构化错误处理。它会记录错误并提供备用行为。这有助于保持应用程序的稳定性。

最佳实践

来源

PHP headers_sent 文档

本教程通过实际示例介绍了 PHP headers_sent 函数,用于 Web 应用程序中的标头管理和调试。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。至今,我已创作了超过 1,400 篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 PHP 网络函数