关于使用 session_start 出现 headers already sent 的错误提示

姚洪楼 发表于 历史资料库 分类,
0

Warning: session_start(): Cannot send session cookie – headers already sent by (output started 
at /www/users/honglousky.com/config.php:1) in /www/users/honglousky.com/index.php on line 5

Warning: session_start(): Cannot send session cache limiter – headers already sent (output started 
at /www/users/honglousky.com/config.php:1) in /www/users/honglousky.com/index.php on line 5

安装一个php程序时,我遇到了上面的错误提示。通过Google搜索相关的资料,得知:发生这一类问题的原因是因为在程序中使用 session_start()时,之前已经有实际的html内容输出了。或许你会说,我没有啊,我只不过是echo或print一条消息了。——很抱歉,你的echo或print语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的session_start()调到程序的第一行。

但是,我查看了相关的php文件,session_start()前面并没有任何输出。这也就意味着,我遇到的问题,并不是因为session_start()之前有输出,应该还有其他的原因。

之后我也看了月光博客上面的相关介绍,发现那些方法也不是我所想要找寻的理想解决方法。于是继续摸索着,终于,在经过几个小时的测试之后,我发现了问题的真正所在——编码格式问题。

如上图,使用记事本打开php文件,将文件编码保存为ANSI,问题便解决了。

大家以后如果遇到类似的问题,可以参考如下处理步骤:
第一步、查看session_start()之前是否有输出,如果有,将session_start()提到最前。
第二步、查看相关文件的编码格式,如果编码格式是UTF-8或者其他,需将其改为ANSI。
第三步、如果以上步骤还不能解决你的问题,那么就请参考月光博客提供的方法,具体如下:

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