解决session_start出现的headers already sent错误
Tags: BOM, header, php, session, UTF-8 欢迎引用、转载、修改,在转载时附上本文URL即可。
用记事本将文件全部转换成UTF-8格式后使用session_start()和header()函数的时候报警告,类似下面这种:
Warning: Cannot send session cookie - headers already sent by (output started at F:done.php:2) in F:done.php on line 4
Warning: Cannot send session cache limiter - headers already sent (output started at F:done.php:2) in F:done.php on line 4
在网上查找相关内容得知是在session_start()之前出现了输出,给出的解决方法也是包罗万像。一些人说是打开php.ini中的session_auto_start;有些人说是要建立temp文件夹,修改session.save_path的值指向temp文件夹;还有一些要求使用Ob_Start()函数。
不过,上面没有一种方法能起作用。
后来继续寻找原因,终于发现是因为使用记事本进行UTF-8格式转换时,文件开始处会被插入BOM(Byte Order Mark,字节序标记),正是这个BOM影响到了session。
网上给出了一些解决办法,其中之一是用写字板打开,会看到一个乱码(3字节长),删除即可,不过我没看到有乱码。再后来有人推荐使用Uedit32,在保存时选择“UTF-8 无BOM”就可以了,使用后session执行正确。
发现使用UltraEdit-32保存为UTF-8的一部份文件被EditPlus和记事本识别为ANSI编码。这篇UTF-8的BOM问题说明了很多问题,这次也终于发现了UltraEdit-32的确比EditPlus强悍许多,所以放弃EditPlus转向UltraEdit-32了。