我使用的set_cookie()上一个网站。之后,添加一些功能,我得到 Warning: Cannot modify header information - headers already sent by... 错误。线路数量引用的头发起的是非常的行set_cookie()是!我查过,这不是所谓的两倍。

我怎么可以追踪这些过早头?我看了看源代码并且没有看到任何流浪人物或任何东西之前错误的消息开始(我采用xdebug,所以第一件事就是
, 我以为是我,但是实际上开始xdebug消息)。我grepped我的代码,用于额外 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

我找到了!这是我当时遗落周围全部由自己的页面之一flush();。出人意料的是,它不能正确地结合$filename$linenumberheaders_sent()

其他提示

可以使用 headers_sent()

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

一个办法是从运行与标准错误的命令行脚本重定向到空。

这会告诉你,被发送到stdout一切,即一切,服务器会发送到客户端。

我们希望,一旦你看到这一点,就会清楚在您的标题是从哪里来的。

除了使用 headers_sent 来检测,如果HTTP头已经发送,可以使用 PHP的输出控制 到缓冲区的输出。这可以让你改变的头即使你已经做了一些产出。

这里是一些例子使用的明确产出的缓冲通过调用 ob_start:

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

但是请确保您的呼叫 ob_start 之前的任何产出完成。否则HTTP头可能已经发送。

你能粘贴代码?

如果其说头已经由[行,其中set_cookie是]发送,则误差是进一步在脚本。

您确定你没有任何包含文件被你set_cookie()初始化之前叫什么名字?你有跑步,因为如果你这样做,你可以只设置Cookie在你的脚本,同样的点作为你开始的会话的会话。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top