Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

请教关于使用 session_start 出现的 headers already sent错误

[复制链接]
幽灵独奏曲 发表于 2005-12-22 14:51:20 | 显示全部楼层 |阅读模式
关于使用 session_start 出现的 headers already sent错误的解释

在我使用 discuz2.5 时出现 headers already sent 错误。

出错描述:

   文件01: install.php
   描述
Warning: Cannot modify header information - headers already sent by (output started at d:\freehost\ClubPoint001\web\bbs\installa.php:1) in d:\freehost\ClubPoint001\web\bbs\installa.php on line 198

   代码

   header('Content-Type: text/html; charset='.$lang['charset']);


  文件02:include/common.php
  描述
Warning: Cannot modify header information - headers already sent by (output started at d:\freehost\ClubPoint001\web\bbs\installa.php:1) in d:\freehost\ClubPoint001\web\bbs\installa.php on line 198

  代码
  if($sid != $_COOKIE['sid']) {
        setcookie('sid', $sid, $timestamp + 2592000, $cookiepath, $cookiedomain);
}


错误导致:

   无法正确 注册 & 登录


经过测试发现以下原因,请教高手。寻求解决方法。

以下正文:  
请看详细的错误程序和输出结果
<html>
<?
echo "testing ... ";
session_start();
?>
</html>

输出为
testing ...
Warning: Cannot send session cookie - headers already sent by (output started at F:php2000test.php:2) in F:php2000test.php on line 4

Warning: Cannot send session cache limiter - headers already sent (output started at F:php2000test.php:2) in F:php2000test.php on line 4

分析:
主要原因,php.ini里有关于session 的定义,默认是使用 cookie
[session]
session.use_cookies = 1 ; whether to use cookies

这句表明使用 cookies 存储session 而 cookies的设置必须在正式 htm 之前,也就是只能在 header 里面才行,所以造成这个错误的发生

我修改程序为
<?
echo "testing ... ";
session_start();
?>
同样错误,因为 echo 已经输出了

我们修改程序为
<?
$i=1;
session_start();
?>
运行正确表明在session_start的前面可以有计算语句,但是不能有输出语句

我尝试过修改
session.use_cookies = 0 ; whether to use cookies
但是没有成功,希望知道答案的朋友通知我,如何去掉cookie方式的 session
回复

使用道具 举报

 楼主| 幽灵独奏曲 发表于 2005-12-22 16:14:56 | 显示全部楼层

彻底杜绝warning: Cannot add header information - headers already sent in...

一直到我自己找出原因,
都没有人帮忙回帖地??????

自己回答啦。


只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它
看了PHP手册,回答如下:
6. 我得到消息“Warning: Cannot send session cookie - headers already sent...”或者“Cannot add header information - headers already sent...”。

header(),setcookie() 和 session 函数需要在输出流中增加头信息。但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的脚本是否已经发送了头信息。请参阅“输出控制函数”。
{意思是:不要在使用上面的函数前有任何文字,空行,回车,空格等.但...问题是,这答案并不令人满意.

首先:这错误是怎么产生的呢?让我们来看看PHP是如何处理HTTP header输出和主体输出的。

PHP脚本开始执行时,它可以同时发送header(标题)信息和主体信息. Header信息(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中. 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题).但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print() 调用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header.而后继续发送主体数据.从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一.

好!那我们来解决它:


笨方法:把错误警告全不显示!

c掩耳盗铃之计,具体方法就不说了 ^_^解决方案:


1)适用于有权限编辑PHP.INI的人

#\!V n%b-Jk%m打开php.ini文件(你应试比我清楚你的php.ini在哪里),找到 伊佳E网

output_buffering =改为on或者任何数字.如果是IIS6,请一定改为ON,不然你的PHP效率会奇慢.使用虚拟主机,不能编辑PHP.INI,怎么办?
简单:
在你的空间根目录下建立一个.htaccess文件,内容如下:

AllowOverride All
PHP_FLAG output_buffering On
幸的情况是:还是不行?全部网页都不能显示啦?
那么,你可以打电话骂一通空间商,然后让他给你把apache的.htaccess AllowOverride打开

3)在PHP文件里解决

启用output buffering机制。 Output buffering支持多层次 -- 例如,可以多次调用 ob_start() 函数
ob_end_flush() (输出缓冲)并禁用output buffering机制。

清除output buffer但不发送,并禁用output buffering。
将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出。

原理:
output_buffering被启用时,在脚本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4.0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,因为header实际上并没有发送。当全部脚本终止时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-11-6 16:07 , Processed in 0.102088 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表