在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, 结果中招了.另外,还见过一个另类的解法,就是在php.ini中把session.auto_start 的值由0改为1, 然后重启apache. 直接启用session_start, 可以不用在页面代码上写session_start()函数,当然写了也无所谓. 这个方法药性很大,直接起效,但副作用也不小,一旦程序迁移到另外一台服务器,忘记启用session.auto_start(或者没有权限修改php.ini或重启apache), 结果是要么session不起作用(没在页面写session_start),要么乱蹦上面的错误(有写session_start)
问个无关的问题:php升级到php5.3.x后,zend optimizer就不能工作了,zend官方好像也没有对应的版本可以下载。那么,除了给php降级到php5.2.x外,还有没有其他办法?
这个问题具体不清楚,但是如果Zend Optimizer尚不支持php5.3版本的话,那么应该有两件事情可以做:
1. 降级php
2. 等待支持