PHP 警告:标头已在未知 [duplicate] 中发送

PHP warning: headers already sent in Unknown [duplicate]

提问人:kari.patila 提问时间:3/8/2009 更新时间:10/8/2023 访问量:12620

问:

我正在寻找可能触发以下PHP警告的东西:

PHP 警告:无法修改标头 信息 - 已发送的标头 第 0 行未知

PHP 错误报告

评论


答:

3赞 Hawk Kroeger 3/8/2009 #1

我认为发生的事情是内置的 php 函数之一正在输出一些东西。我已经在几个 IMAP 函数中看到了这一点,它们只放了一个“ ”(空格字符),它把事情搞砸了。 你可以使用 Xdebug 或 Zend 调试器来追踪它,但如果你两者都没有 尝试将输出缓冲包装在您认为可能导致它的一些函数周围。

ob_start();
callYourFunction();
ob_end_clean();

一次执行一个功能,当错误消失时,您将知道哪个功能导致了问题,然后您可以提交错误报告或将其作为黑客保留。但至少您知道是什么功能导致了问题。

编辑:事实上,您的输出发生在第 0 行,这意味着它是一个 C 级函数在执行输出,而不是使用 PHP 编写的任何代码。

评论

0赞 Jānis Elmeris 1/6/2022
您能否详细解释一下如何使用 Xdebug 调试这些情况?
1赞 Gumbo 3/8/2009 #2

您是否检查过文件中是否有意外的 UTF-8 BOM

评论

0赞 Jon Adams 6/6/2012
这是我的问题。现在修复得益于 Notepad++“编码->在没有 BOM 的情况下转换为 UTF-8”功能
3赞 lpfavreau 3/8/2009 #3

它可能有很多东西,但正如其他人所说,它通常只是一个空间,它被输出到某个地方,然后发送一个 header() 命令,这通常很好,但在开始发送内容后就不行了(在这种情况下可能只是一个空格)。

使用 ob_start() 通过缓冲输出来阻止输出立即输出。因此,这是一个潜在的解决方案,或者至少是诊断它来自哪里的方法,正如zodeus所说


导致这些空间丢失的一个常见情况是在这种情况下。

global.php

<?php
  $variable = 1;
  $database = 'something else';
?> <-- A space here
 <-- Or here

index.php

<?php

  require('global.php');
  $var = dosomething();
  header('Location: http://www.example.com/');

?>

解决此问题的一种方法是删除global.php文件末尾的 ?>。你不需要这些,它们只有在你开始把HTML放在你的PHP代码之后时才有用。所以你会有:

<?php
  $variable = 1;
  $database = 'something else';

当您执行 时,空格不会在 之前输出。require()header()


为了说明输出的内容和标头的问题,是给出类似错误的另一种常见情况。当您忘记在重定向后停止处理时,就会发生这种情况。header()

if ($notLoggedIn) {
  header('Location: http://www.example.com/login.php');
}
echo 'Welcome to my website'; // this will be outputted, 
                              // you should have an exit() 
                              // right after the header()

评论

0赞 lpfavreau 3/8/2009
与往常一样,感谢解释反对票的评论,以便我可以进行调整、学习或删除错误的问题。谢谢。
0赞 Jānis Elmeris 1/6/2022
您正在描述以下情况:错误消息包含有关已发送标头或无法发送标头的更多详细信息。然而,这里的问题是关于PHP不告诉任何细节的情况(“在第 0 行的未知中”)。也许这就是投反对票的原因,我不知道。
0赞 dar7yl 3/8/2009 #4

该错误告诉您某些东西已经发送了输出,这将强制发送标头,因为标头必须写在 http 消息的正文之前。

我发现最常见的问题是标题中的文本。可见:

<?php // myfile.php
  include 'header.php';
?>

在header.php:

<?php // header.php
   ....
 ?>

您在这里看不到的是有一个空白 - 在结束 '' 之后有一个空格或 CR/LF。这是输出,因为 php 标准说 php 标签之外的任何内容都输出为 html。?>

解决方案是确保您确保在关闭后擦除所有内容”?>'

评论

0赞 Alnitak 3/8/2009
有一个PHP标准??!?!
9赞 kari.patila 3/8/2009 #5

原来是那条线

ob_start("ob_gzhandler");

这导致了警告。这似乎在 2001 年被报道并修复,但由于某种原因,它不断出现。