如何找出输出的起始位置?

时间:2011-07-13 21:03:51

标签: php header

我注意到我网站的源代码中HTML上面有两个空行。它看起来像这样:

<!-- Two empty lines here, StackOverflow won't let me post empty lines -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html>

HTML是使用PHP生成的。如何找出输出的起始位置?

我尝试在<?php header('...'); ?>之后添加<html>,希望触发错误,例如“无法修改标题。输出从行开始...”但是没有发生错误。

7 个答案:

答案 0 :(得分:11)

如果要获取输出开始的文件名和行号,可以使用两个可选参数调用headers_sent()函数:

$sent = headers_sent($file, $line);

这两个变量$file$line将包含调用函数后要查找的信息。您不需要等待错误消息(但如果您没有看到任何错误消息并且想要查明原点,则可能需要刷新输出(在许多地方)。因此,请确保禁用输出缓冲。

答案 1 :(得分:2)

它可能不会触发错误,因为到目前为止您打印的内容太短并且在标题调用之前仍然是缓冲的。

尝试输出更多数据,例如:

echo str_repeat('a', 10000);

然后尝试输出一些标题。然后,您应该看到预期的PHP错误(假设您的错误报告设置已正确调整)。

答案 2 :(得分:0)

将这些行放在PHP中的某处显示错误:

error_reporting(E_ALL);
ini_set('display_errors','on');

这将触发标头错误!

它可能在PHP文件的末尾;您应该考虑删除结束的PHP标记(?>)以消除此问题。

答案 3 :(得分:0)

要直接回答您的问题,任何echo或print语句或任何直接将结果返回到标准输出的函数都将导致输出开始。此外,如果在开始<?php标记之前有任何HTML或文本或空行,则会导致输出开始。

您可以直接在<?php标记下方的条目文档顶部添加ob_start()来直接解决此问题。并在文档的最后添加ob_end_flush()。这看起来像这样。

将此内容添加到文档的最顶层:

<?php
    ob_start();
?>

将此内容添加到文档的最底部:

<?php
    echo ob_end_flush();
?>

这使您可以保留当前的代码,并在代码中的任何地方输出标题,而不会出现错误。

答案 4 :(得分:0)

我在Drupal(很多iles)上遇到了同样的问题,我尝试了上面的几个答案而没有任何结果。

最后我发现 find 方式(参见Elegant way to search for UTF-8 files with BOM?),它指出了一个愚蠢的错误:模块文件开始时的空格:

find . -type f -name '*.module' -print0 | xargs -0r awk '/^ / {print FILENAME}{nextfile}'
find . -type f -name '*.php' -print0 | xargs -0r awk '/^ / {print FILENAME}{nextfile}'
find . -type f -name '*.inc' -print0 | xargs -0r awk '/^ / {print FILENAME}{nextfile}'

答案 5 :(得分:0)

我在隐藏的BOM中遇到了类似的问题,但这也适用于空白行和其他虚假字符,所以我想在此添加我的发现。

添加假标题(“”);调用代码是查找输出开始位置的最佳方法,但是......最有可能的是,PHP配置默认启用了output_buffering。 检查this

在脚本开头添加:

if (ob_get_level()) ob_end_clean();

将关闭输出缓冲并使header()调用抱怨并说明输出开始的位置。

答案 6 :(得分:-2)

如果您的代码中第一个<?php上方有任何空行(假设您在文件的“顶部”有空白行),就会发生这种情况。