【问题标题】:PHP warning: headers already sent in Unknown [duplicate]PHP警告:标头已在未知中发送[重复]
【发布时间】:2010-10-11 22:53:07
【问题描述】:

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

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

【问题讨论】:

    标签: php error-reporting


    【解决方案1】:

    原来是这条线

    ob_start("ob_gzhandler");
    

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

    【讨论】:

    • 很好地找到了您的解决方案!然后,您可以选择您的答案作为正确答案,以便可以在其他答案的顶部看到它。您也可以对其进行编辑以添加更多详细信息,以便对其他人有所帮助。
    • 接受自己的答案有 48 小时的时间限制。至于细节,我想不出还有什么要补充的。
    • 嗯,我在想也许关于“2001 年报告和修复”的更多细节。通过谁?通过 PHP 社区?你有错误报告的链接吗?还是您或您的团队的一些内部错误?它叫什么名字?在所有脚本的开头?在一个包含?在一个已知的图书馆?它可能会有所帮助。 :-)
    • 啊,给你:bugs.php.net/bug.php?id=9031。调用是在 index.php 的第一行,在每个页面视图上进行的,不包括在内。
    • 我收到了完全相同的警告,并将其追踪到 ob_gzhandler。我的页面似乎仍然可以正常工作。忽略此警告是否安全(在这种情况下)?
    【解决方案2】:

    可能有很多东西,但正如其他人所说,它通常只是一个位于某个地方的空间,它会被输出,然后发送 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/');
    
    ?>
    

    解决此问题的一种方法是删除 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()
    

    【讨论】:

    • 与往常一样,感谢评论解释反对票,以便我可以调整、学习或删除问题(如果有误)。谢谢。
    • 您正在描述错误消息包含有关已发送标头或无法发送标头的更多详细信息的情况。然而,这里的问题是关于 PHP 没有提供任何细节的情况(“在第 0 行未知”)。也许这就是投反对票的原因,我不知道。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 您能否详细说明如何使用 Xdebug 调试这些案例?
    【解决方案4】:

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

    【讨论】:

    • 这是我的问题。由于 Notepad++“编码->转换为 UTF-8 没有 BOM”功能,现已修复
    【解决方案5】:

    这个错误告诉你有东西发送了输出,这将强制发送标头,因为标头必须写在 http 消息正文之前。

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

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

    在 header.php 中:

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

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

    解决方案是确保您确保在关闭“?&gt;”后删除所有内容

    【讨论】:

    • 有一个 PHP 标准 ??!?!
    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2011-01-15
    • 2013-11-24
    • 2011-04-17
    • 2015-01-24
    • 1970-01-01
    • 2014-06-24
    相关资源
    最近更新 更多