Warning: Cannot send session cookie – headers already sent…

相信大多数人在写PHP代码的时候,都遇到过类似 "Warning: Cannot send session cookie – headers already sent…“或者”Cannot add/modify header information – headers already sent…" 这样的Warning提示.下面我们就来看看发生这个Warning的原因及解决方案。

函数 header(),setcookie() 和 session 函数需要在输出流中增加头信息。但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的脚本是否已经发送了头信息。请参阅“输出控制函数”。

headers_sent — Checks if or where headers have been sent.

意思是:不要在使用上面的函数前有任何文字,空行,回车,空格等。但。。。问题是,这答案并不令人满意。因为往往程序在其他PHP环境下运行却正常。

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

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

下面我们来看看解决方案:

1. 把错误警告全不显示, 治标不治本的方法

error_reporting(E_ERROR | E_PARSE); 这里不要显示E_WARNING即可

2. 编辑php.ini

打开php.ini文件, 找到output_buffering = 改为on或者任何数字。

3. 如果没有权限编辑php.ini,如使用虚拟主机的

在你的空间根目录下建立一个。htaccess文件,内容如下:

AllowOverride AllPHP_FLAG output_buffering On

如果还是不行,那么,再用下面的方法:

在PHP文件的最开始加入:ini_set(”output_buffering”, “1″);

让这个页面打开PHP的输出缓存。

4. 在PHP文件里解决

ob_start()

启用output buffering机制。 Output buffering支持多层次 — 例如,可以多次调用 ob_start() 函数。

ob_end_flush()

发送output buffer(输出缓冲)并禁用output buffering机制。

ob_end_clean()

清除output buffer但不发送,并禁用output buffering。

ob_get_contents()

将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出。

原理:

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

5. 如果以上方法都不能等到满意的解决办法,请用如下办法:

用notepad++等编辑器将该文件转为UTF-8 without BOM编码的文件,再试试.

造成的原因主要由以下两点:

一,在Header()函数之间输出了其他内容(一般由浏览器隐藏发送),导致了后来的Header不能再次发送新的页面类型。这可以通过开启Output_Buffering来解决,方法2,3,4就是这样。

二,PHP文件采用UTF-8编 码,由于编码不兼容(特别是通过其他编码转换过来的),产生了BOM《在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。导致了的头文件不能正确识别,这时只要去除UTF-8文件中的BOM就可以了,方法5就是基于这种原理的。

时间: 2024-11-08 15:54:33

Warning: Cannot send session cookie – headers already sent…的相关文章

在用php写代码时遇到Cannot send session cookie - headers already sent by (output started at E:\web\Apache2\htdocs\index.php:1) in E:\web\Apache2\htdocs\functi

Warning Cannot send session cookie - headers already sent...问题的解决(PHP的UTF-8 BOM引起的问题) 习惯了用edit plus进行php编程,所以有时会出现一些不为人知的错误,很麻烦;.近日,在开发项目时,某些页面总是出现以下问题: Warning: session_start() [function.session-start]: Cannot send session cookie - headers already s

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by

配置php网站的时候,经常会在页首出现Warning: session_start() [function.session-start]: Cannot send session cache limiter,也不影响页面打开. Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at D:\orther

Warning: session_start() [function.session-start]: Cannot send session cookie解决办法

在很多时间使用了session就会出来如下提示了, Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/u114264/include/db_mysql教程.class.php教程:1) in /home/u114264/login1.php on line 3 Warning: sessio

php session_start()关于Cannot send session cache limiter - headers already 错误

把DW修改默认编码为UTF-8     charset和编译器编码都要改 在windows下编程,当使用session_start()方法的时候,有时会报 session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /var/www/inpublisher/php1.php:1)这样的错误 说是已经有输出,用编辑器打,前面

【Head First Servlets and JSP】笔记13:session & cookie

session的接口 杀死会话 cookie的性质 cookie的接口 再总结——cookie.session的前世今生 简单的定制cookie示例 1.session的接口,配合一些代码来理解. 2.杀死会话——杀死的含义是使session无效化(在JVM中清除??). 立刻杀死,已知方式有两种, 在DD中设定“默认期限” 在代码中对具体session设定“期限” 3.cookie的特性 4.cookie的接口 从客户请求得到cookie——稍微现代点的方法是这样的: Cookie[] coo

ASP.NET:Application,Session,Cookie,ViewState和Cache之间的区别(转)

在ASP.NET中,有很多种保存信息的对象.例如:Application,Session,Cookie,ViewState和Cache等,那么它们有什么区别呢?每一种对象应用的环境是什么? 为了更清楚的了解,我们总结出每一种对象应用的具体环境,如下表所示: 方法 信息量大小 保存时间 应用范围 保存位置 Application 任意大小 整个应用程序的生命期 所有用户 服务器端 Session 小量.简单的数据 用户活动时间+一段延迟时间(一般为20分钟) 单个用户 服务器端 Cookie 小量

自动登录:Filter,Session,Cookie综合例子

初始登录Servlet: package cn.xbai.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class

ASP.NET:Application,Session,Cookie,ViewState和Cache之间的区别

在ASP.NET中,有很多种保存信息的对象.例如:Application,Session,Cookie,ViewState和Cache等,那么它们有什么区别呢?每一种对象应用的环境是什么? 为了更清楚的了解,我们总结出每一种对象应用的具体环境,如下表所示: 方法 信息量大小 保存时间 应用范围 保存位置 Application 任意大小 整个应用程序的生命期 所有用户 服务器端 Session 小量.简单的数据 用户活动时间+一段延迟时间(一般为20分钟) 单个用户 服务器端 Cookie 小量

第八篇:forms组件,cookie和session

forms组件 常常用于注册页面的用户输入的数据进行校验 渲染页面 校验数据 展示信息 在使用forms组件的时候,需要在应用下新建一个py文件,例如: myforms.py 在文件中写一个类: from django import forms class MyRegForm(forms.Form): # 用户名最少3位最多8位 username = forms.CharField(max_length=8,min_length=3) password = forms.CharField(max