0

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

如何追踪这些过早的标题?我查看了源代码,在错误消息开始之前没有看到任何杂散字符或任何东西(我正在使用xdebug,所以第一件事是a
,我以为是我,但实际上是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. 
4

7 回答 7

7

您可以使用headers_sent()

if (!headers_sent($filename, $linenum)) {
    set_cookie(/*...*/);
} else {
    echo "Headers already sent in $filename on line $linenum\n";
    exit;
}
于 2010-03-12T15:58:37.133 回答
2

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

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

希望一旦你看到这个,你的标题来自哪里就会很清楚。

于 2010-03-12T16:01:47.490 回答
1

除了headers_sent用于检测 HTTP 标头是否已发送外,您还可以使用PHP 的输出控件来缓冲输出。即使您已经完成了一些输出,这也允许您更改标题。

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

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

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

于 2010-03-12T16:37:57.367 回答
0

可以贴一下代码吗?

如果它的标头已经由 [set_cookie 所在的行] 发送,那么脚本中的错误会进一步出现。

于 2010-03-12T15:59:17.880 回答
0

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

于 2010-03-12T16:24:56.790 回答
0

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

于 2010-03-12T16:35:04.377 回答
0

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

于 2010-03-23T15:01:29.440 回答