随机无法发送会话缓存限制器-标头已发送


Random Cannot send session cache limiter - headers already sent

在服务器日志中,我经常看到错误

PHP警告:session_start()[function.session start]:无法发送会话缓存限制器-标头已发送(输出开始于/public_html/templates/meta.php:294)/第7行上的public_html/include/query.php

似乎很明显,我的输出开始得更快。。。但是

错误只会在某些时候产生,我无法重现它——这可能是因为"session_start()"在if语句中。

这是query.php 的开始

<?php
//  we are including here so that we can check user logged in or not on each and everypage  
if(!isset($_SESSION))
{
    //To make the session work across multiple domains.
    session_set_cookie_params(0, '/', '.mydomain.com');
    session_start();        
}

所有地方query.php都包含在meta.php 之前

meta.php主要是html和js,很少有php块,第294行在一些js函数的中间。

但最让我感兴趣的是,对于根本不涉及这两个文件的请求,我也会收到这个错误。

例如

来自访问日志

66.249.72.33-[19/Aug/2013:22:44:30+0100]"GET/robots.txt HTTP/1.1"404 7592"-"Mozilla/5.0(兼容;Googlebot/2.1;+http://www.google.com/bot.html)"

66.249.72.33-[19/Aug/2013:22:44:30+0100]"获取/content_files/SPIKES%20protocol.pdf HTTP/1.1"200 215267"-"Mozilla/5.0(兼容;Googlebot/2.1;+http://www.google.com/bot.html)"

和错误日志

〔2013年8月19日星期一22:44:30〕〔error〕〔client 66.249.72.33:44269〕AH01215:PHP警告:session_start()〔function.session start〕:无法发送会话cookie-标头已由第7行/public_html/include/query.PHP中的/public_html/templates/meta.PHP发送(输出起始于/public_hhtml/meta.PHP)

〔Mon Aug 19 22:44:30 2013〕〔error〕〔client 66.249.72.33:44269〕AH01215:PHP警告:session_start()〔function.session start〕:无法发送会话缓存限制-标头已在第7行的/public_html/include/query.PHP中发送(输出起始于/public_html/templates/meta.PHP:294)

正如你所看到的,在22:44:30谷歌机器人提出了2个请求robots.txt排名第一,他得了404,因为没有robots.txt第二个是一些pdf文件

在这两种情况下都没有涉及php代码,但我收到了这些请求的php警告。

在这些之前或之后,没有来自谷歌机器人的其他访问日志。

代码的一般结构类似于

<?php
if(isset($_GET['url1'])){$url1 = $_GET['url1'];}else {$url1 = "";}
if(isset($_GET['url2'])){$url2 = $_GET['url2'];}else {$url2 = "";}
require_once('include/query.php');
require_once('include/auth.php');
/* some php code */
?>
<?php include 'templates/meta.php'; ?>
//html

但是,对于根本不使用query.php或meta.php的请求,会生成错误,就像在给定的示例中一样。

通常,我发现"已发送的头"错误实际上是空白错误。也许可以检查所有这些页面之间共享的任何文件,看看在关闭的?>标记之后是否有额外的换行符或空格。一般来说,我尽量避免在文件末尾使用关闭PHP标记,因为它们无论如何都会被解析器丢弃。

Headers already send错误主要发生在用于重定向或其他填充的header函数之前发生echo或任何其他输出语句时。

问题出在自定义404页面上。

为了澄清,我不得不说,这是一个有5年历史的网站,我没有设计它只是做了一些修改。