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