【发布时间】:2010-10-11 22:53:07
【问题描述】:
我正在寻找可能触发以下 PHP 警告的内容:
PHP 警告:无法修改标头 信息 - 已发送的标头 第0行未知
【问题讨论】:
标签: php error-reporting
我正在寻找可能触发以下 PHP 警告的内容:
PHP 警告:无法修改标头 信息 - 已发送的标头 第0行未知
【问题讨论】:
标签: php error-reporting
原来是这条线
ob_start("ob_gzhandler");
导致警告。这似乎已在 2001 年报告并修复,但由于某种原因,它不断出现。
【讨论】:
可能有很多东西,但正如其他人所说,它通常只是一个位于某个地方的空间,它会被输出,然后发送 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 函数之一正在输出一些东西。我已经在几个 IMAP 函数中看到了这一点,它们只放了一个“”(空格字符),它把事情搞砸了。 您可以尝试使用 Xdebug 或 Zend 调试器跟踪它,但如果您两者都没有 尝试将输出缓冲包裹在您认为可能导致它的一些函数周围。
ob_start();
callYourFunction();
ob_end_clean();
一次执行这个功能,当错误消失时,您会知道是哪个功能导致了问题,然后您可以提交错误报告或将其作为 hack 保留。但至少你知道是什么功能导致了问题。
编辑:说你的输出发生在第 0 行的事实意味着它是一个 C 级函数执行输出,而不是任何使用 PHP 编写的代码。
【讨论】:
您是否检查过您的文件中是否存在意外的UTF-8 BOMs?
【讨论】:
这个错误告诉你有东西发送了输出,这将强制发送标头,因为标头必须写在 http 消息正文之前。
我发现的最常见的问题是标题中的文本。可见:
<?php // myfile.php
include 'header.php';
?>
在 header.php 中:
<?php // header.php
....
?>
您在这里看不到的是,在结束的“?>”之后有一个空格 - 一个空格或 CR/LF。这是输出,因为 php 标准规定 php 标记之外的任何内容都输出为 html。
解决方案是确保您确保在关闭“?>”后删除所有内容
【讨论】: