<?php

万恶的BOM头

之前就有同事遇到类似问题,cookie无法设置成功(关掉了错误信息),或者是redirect、session失效,其实都是BOM在捣鬼。。一般产生BOM的途径大多是使用记事本改变文件的内码所致,因此在修改文件内码时不要使用记事本。

如果是打开错误信息,在setcookie的时候出现下面错误提示:

Cannot modify header information - headers already sent by ….

熟悉setcookie函数的话一看便知道是执行setcookie之前数据有输出,但是大部分情况下执行动作的PHP都是include若干个文件,一行行排查是很麻烦的事情,有两个解决办法:
一是:
ob_start();
在setcookie之前加上代码:
ob_get_clean();
这是为了获取setcookie之前页面输出的内容。页面运行后,显示输出了一个空字符串,也就是说,setcookie之前没有任何输出。

二是:
最彻底的方法,查找加载进来的文件,用十六进制编辑器可以看到包含BOM头的文件是以“ef bb bf”开头的,这个正是导致上面错误的来源,删掉、保存、重新测试,如果还有问题,再检查其他文件。。直到一切正常

BOM是什么意思?
BOM是“Byte Order Mark”的缩写,用于标记文件的编码。并不是所有的文本编辑工具都能识别BOM标记

Tags:

Leave a Reply