正在发送标头,但输出已发送


Headers are being sent although output already sent

据我所知,在发送输出后不可能发送HTTP标头,唯一的解决方法是使用输出缓冲

但是我的PHP脚本即使在输出发送之后也能够发送头。这是我的代码

Text output already sent
<?php
header('Location: test2.php');
die();
?>

为什么此代码没有给出"HTTP标头已发送"的错误有没有其他方法可以打开输出缓冲?

编辑:

我正在使用wamp 在本地主机上运行它

以上代码中不包含任何文件

我刚刚注意到phpinfo()中的output_buffering指令被设置为1但是当我在php.ini文件中检查它时,它被设置为关闭

你是对的,这不应该起作用。

首先,你确定标题已经写好了吗?或者你只是想知道为什么没有显示错误消息?也许错误报告已关闭?在这种情况下,尝试提高错误报告级别:

error_reporting(E_ALL);
ini_set("display_errors", 1);

调试完成后,将其从代码中删除。错误应该记录到日志文件中,并且永远不要在生产环境中显示

此外,请检查标头是否真的已发送。您可以使用wget来完成此操作,例如:

wget -S http://example.com/

curl:

curl -v http://example.com/

您还可以在Chromes开发者控制台中看到HTTP标头。在其他浏览器中,很可能也是如此。

如果真的发送了头,那么可能存在一些关于输出缓冲的神奇之处。您是在本地运行还是在远程主机上运行?如果这不是您的主机,则可能是提供商设置的。PHP有一个自动预置和附加自定义代码的功能。检查auto_prepend_file和auto_append_file的php.ini设置。可能隐藏了一些ob_start()等。您可以通过调用phpinfo()ini_get()查看所有PHP设置。

您不会看到错误,因为启用了输出缓冲。试试这个代码:

<?php
ob_end_clean();
?>
Text output already sent
<?php
header('Location: test2.php');
die();
?>

它返回错误:

文本输出已发送警告:无法修改标头信息-已发送标头

您可以使用headers_send函数来检查是否发送了标头以及在哪里发送了:

if (!headers_sent($filename, $linenum)) {
    header('Location: test2.php');
    exit;
} else {
    echo 'Headers sent from '. $filename;
}

然后检查$filename