关于session失效的问题,UTF-8(无BOM)和有BOM。

最近移交了一个项目,在本机的win和linux环境下,这个网站都没有任何问题,在同事的机器上,在测试的vps上也都没有问题,但是到了客户那边的服务器上,就出现了一个问题,无法登录

程序是遗留下来的,最近移交到我这儿,找了很久很久的问题,最后

print_r($_SESSION); 后,居然客户那边就能登录了

最后发现是session失效的罪魁祸首是源文件编码。


源文件的编码是UTF-8,这个无可厚非,可是用在session_start(); 存在的地方,会产生一个错误

大家在保存文件源码的时,有很多的编辑器都有一个编码选项,其中有UTF-8 和UTF-8 (无BOM),(带Unicode签名(BOM)和不带Unicode签名),UTF-8 也就是UTF-8 BOM,又叫UTF-8签名,是为了支援UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉你编辑器当前文件采用何种编码,方便编辑器的识别,虽然在编辑器中不会显示,但是会产生输出,就好像多了一个空行!

BOM 就是 Byte Order Mark,是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。比如windows自带的记事本,在保存一个以UTF-8编辑的文件时,会在文件开始的地方插入三个不可见的字符 0xEF 0xBB0xBF

大家都知道session_start();开始前,不能有其他任何的输出,这里已经输出了bom,

由于php在设计时没有考虑BOM的问题,不会忽略掉UTF-8编码的文件开头BOM的那三个字符,而是会把BOM作为该文件开头正文的一部分,会造成比如header和session_start 文件已经输出的错误

所以我直接用vim打开源码,把程序前面的<0xEF>删除掉,:wq!退出后登录,程序运行成功。


对于这个的解决办法有好几个

1:直接把文件用编辑器转换一次,转换成UTF-8 (无BOM)

2:开启php.ini 中的

output_buffering = 4096 

3:使用类似smarty的方式来避免这个问题。

4:使用linux

你可能感兴趣的:(Php)