彻底杜绝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 相关文章推荐
CodeIgniter php mvc框架 中国网站
May 26 PHP
UCenter Home二次开发指南
May 28 PHP
php 常用类整理
Dec 23 PHP
php set_time_limit()函数的使用详解
Jun 05 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
php之curl实现http与https请求的方法
Oct 21 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
html静态页面调用php文件的方法
Nov 13 PHP
WordPress迁移时一些常见问题的解决方法整理
Nov 24 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 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
建立文件交换功能的脚本(二)
2006/10/09 PHP
php zend解密软件绿色版测试可用
2008/04/14 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
utf8的编码算法 转载
2006/12/27 Javascript
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
jquery实现动态画圆
2014/12/04 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
this在vue和小程序中的使用详解
2019/01/28 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
js实现div色块碰撞
2020/01/16 Javascript
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
python中return的返回和执行实例
2019/12/24 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
黄河的主人教学反思
2014/02/07 职场文书
起诉状范本
2015/05/20 职场文书
党员证明模板
2015/06/19 职场文书
2016年感恩节寄语
2015/12/07 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android