解决php session_start的warning问题

发布于: 2009年07月21日

在php程序中执行session_start()函数可能会出现如下错误:

Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent……

可能的原因如下:

1. php.ini中session.save_path 没有设置到一个可写的目录.  windows下可给c:/tmp, 前提是必须先建立这个目录. Linux下一般设为/temp

2. session_start()必须早于任何到浏览器的输出.一般来讲可以写到第一行.

3.如果还不行,就在前面写个ob_start();

以上三个仅为常规原因,还有一个隐蔽的原因是,php源文件存为UTF-8 .而有的编辑器会在这个文件的开头写上几个字节,称为BOM签名.(具体请参考http://hi.baidu.com/wwwanq/blog/item/b337de3766a43c380b55a95e.html). 我的editplus3.01上没有这个BOM签名,而notepad++上就碰到了,让我一顿好找.其实notepad++也是可以选为UTF-8(无BOM)的,如下图.一开始没有注意到这一点,选了UTF-8, 结果中招了.notepad++另外,还见过一个另类的解法,就是在php.ini中把session.auto_start 的值由0改为1, 然后重启apache. 直接启用session_start, 可以不用在页面代码上写session_start()函数,当然写了也无所谓. 这个方法药性很大,直接起效,但副作用也不小,一旦程序迁移到另外一台服务器,忘记启用session.auto_start(或者没有权限修改php.ini或重启apache), 结果是要么session不起作用(没在页面写session_start),要么乱蹦上面的错误(有写session_start)

2 条评论

  1. 问个无关的问题:php升级到php5.3.x后,zend optimizer就不能工作了,zend官方好像也没有对应的版本可以下载。那么,除了给php降级到php5.2.x外,还有没有其他办法?

  2. 这个问题具体不清楚,但是如果Zend Optimizer尚不支持php5.3版本的话,那么应该有两件事情可以做:
    1. 降级php
    2. 等待支持

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

浙ICP备18056264号-1