php - 追踪过早的标题泄漏

时间:2010-03-12 15:54:23

标签: php header setcookie

我在网站上使用set_cookie()。添加一些功能后,我收到Warning: Cannot modify header information - headers already sent by...错误。它引用的标题所引用的行号是set_cookie()所在的行!我检查过,它没有被调用两次。

如何追踪这些过早的标题?我查看了源代码,并且在错误消息开始之前没有看到任何流浪角色或任何东西(我正在使用xdebug,所以第一件事就是一个,我认为是我,但实际上是开始xdebug消息)。我已经为我的代码添加了额外的echo等等 - 什么都没有。

PHP可以告诉我标题何时何地开始?或者他们是否真的从set_cookie线开始,如果是这样,我是如何让自己陷入这种情况的,我该怎么走出去?


编辑:我不确定我可以粘贴代码 - 你只想要set_cookie()行吗?我认为标题是在那之前出来的。在此之前还有很多事情要进行实例化。而且我也不认为我可以发布所有课程和内容 - 你知道,专有信息;)


编辑:我已经摆脱了所有终止分隔符(所有?> s),并确保每个包含文件的第一个字符为<?。这令人沮丧!在我做这些最近的改变之前它正在工作:((

另外,为什么headers_sent()不起作用?

if ( headers_sent($filename, $linenum) ) { 
    echo "headers sent: $filename:$linenum."; 
}   
set_cookie(...); 

给出

headers sent: :0. 

7 个答案:

答案 0 :(得分:7)

您可以使用headers_sent()

if (!headers_sent($filename, $linenum)) {
    set_cookie(/*...*/);
} else {
    echo "Headers already sent in $filename on line $linenum\n";
    exit;
}

答案 1 :(得分:2)

一种方法是从命令行运行脚本,并将STDERR重定向到null。

这将显示发送给STDOUT的所有内容,即服务器发送给客户端的所有内容。

希望一旦你看到这一点,你的标题就会变得清晰。

答案 2 :(得分:1)

除了使用headers_sent检测HTTP标头是否已被发送之外,您还可以使用PHP’s output control来缓冲输出。即使您已经完成了某些输出,也可以更改标题。

以下是通过调用ob_start使用显式输出缓冲的一些示例:

ob_start();
echo 'foobar';
header('Content-Type: text/plain;charset=utf-8');

但请确保在完成任何输出之前调用ob_start。否则,HTTP标头可能已经被发送。

答案 3 :(得分:0)

可以粘贴代码吗?

如果它的说法标题已经由[line where set_cookie]发送,那么脚本中的错误就会进一步显示。

答案 4 :(得分:0)

您确定在set_cookie()初始化之前没有调用任何包含文件吗?您是否有会话正在运行,因为如果您这样做,您可以在开始会话时在脚本中的同一点设置cookie。

答案 5 :(得分:0)

如果在set_cookie()初始化之前甚至只有一个空格,则会导致标题无法正确发送。也许尝试使用不同的编辑器并检查结果。

答案 6 :(得分:0)

我找到了!这是一个flush();,我在其中一个页面中独自躺着。令人惊讶的是,它没有正确地将$filename$linenumber绑定到headers_sent()