我正在寻找可能触发以下PHP警告的内容:
PHP警告:无法修改标头 信息 - 已发送的标头 第0行未知
答案 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。
解决方法是确保在结束“?>
”之后确保删除所有内容