PHP警告:已在“未知”中发送标头

时间:2009-03-07 17:35:24

标签: php error-reporting

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

  

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

5 个答案:

答案 0 :(得分:6)

原来这是行

ob_start("ob_gzhandler");

引起了警告。这似乎在2001年被报道并修复,但由于某种原因,它一直在回归。

答案 1 :(得分:3)

这可能是很多事情,但正如其他人所说,它通常只是一个位于某个地方的空间被输出然后发送header()命令通常是好的,但不是在开始发送之后内容回来(在这种情况下可能只是一个空格)。

使用ob_start()通过缓冲输出立即停止输出。所以这是一个潜在的解决方案,或至少可以诊断它来自zodeus said的位置。


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

<强> 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/');

?>

解决这个问题的一种方法是删除?&gt;在global.php文件的末尾。您不需要它们,只有在PHP代码之后开始使用HTML时它们才有用。所以你有:

<?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()

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

错误告诉您某些内容已发送输出,这会强制发送标头,因为标头必须在http消息正文之前写入。

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

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

并在header.php中:

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

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

解决方法是确保在结束“?>”之后确保删除所有内容