9

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

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

4

5 回答 5

9

原来是这条线

ob_start("ob_gzhandler");

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

于 2009-03-07T20:19:29.300 回答
3

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

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

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

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

于 2009-03-07T17:39:30.633 回答
3

可能有很多东西,但正如其他人所说,它通常只是某个地方的一个空间,它被输出,然后header()发送一个命令,这通常很好,但在开始发回内容之后(可能只是一个空间)这个案例)。

使用ob_start()通过缓冲它来阻止输出立即消失。因此,这是一个潜在的解决方案,或者至少可以像zodeus 所说的那样诊断它的来源。


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

全局.php

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

索引.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()
于 2009-03-07T18:06:59.320 回答
1

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

于 2009-03-07T17:40:19.633 回答
0

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

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

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

在 header.php 中:

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

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

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

于 2009-03-07T20:06:32.123 回答