彻底杜绝PHP的session cookie错误


Posted in PHP onAugust 09, 2009

只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它...............

看了PHP手册,回答如下:

消息“Warning: Cannot send session cookie - headers already sent。。。”或者“Cannot add header information - headers already sent。。。”。

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

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

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

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

好!那我们来解决它:

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

掩耳盗铃之计,具体方法就不说了 ^_^#

解决方案:

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

打开php。ini文件(你应试比我清楚你的php。ini在哪里),找到

output_buffering =改为on或者任何数字。如果是IIS6,请一定改为ON,不然你的PHP效率会奇慢。

2)使用虚拟主机,不能编辑PHP。INI,怎么办?

简单:

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

AllowOverride All

PHP_FLAG output_buffering On

不幸的情况是:还是不行?全部网页都不能显示啦?

那么,你可以打电话骂一通空间商,然后让他给你把apache的。htaccess AllowOverride打开

3)在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到浏览器,然后再发送输出缓冲中的内容。

PHP 相关文章推荐
关于PHP自动判断字符集并转码的详解
Jun 26 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
php设计模式之单例模式实例分析
Feb 25 PHP
PHP扩展程序实现守护进程
Apr 16 PHP
php 无限分类 树形数据格式化代码
Oct 11 PHP
php实现跨域提交form表单的方法【2种方法】
Oct 17 PHP
PHP图片水印类的封装
Jul 06 PHP
一个实用的php验证码类
Jul 06 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
PHP中$GLOBALS与global的区别详解
Mar 21 PHP
PHP array_reverse() 函数原理及实例解析
Jul 14 PHP
Laravel配合jwt使用的方法实例
Oct 25 PHP
PHP 5.3.0 安装分析心得
Aug 07 #PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 #PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 #PHP
PHP 翻页 实例代码
Aug 07 #PHP
php Sql Server连接失败问题及解决办法
Aug 07 #PHP
php_xmlhttp 乱码问题解决方法
Aug 07 #PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 #PHP
You might like
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
PHP个人网站架设连环讲(二)
2006/10/09 PHP
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
php 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
php函数的常用方法及注意之处小结
2011/07/10 PHP
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
js中日期的加减法
2015/05/06 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
文明单位创建材料
2014/12/24 职场文书
自我评价优缺点范文
2015/03/11 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
sql字段解析器的实现示例
2021/06/23 SQL Server
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers