PHP文件诡异的缓冲问题

这是前几周遇到的问题了,我在Linux下,一个同学在Windows下用UltraEdit。
我为某工程创建了一个PHP文件,工程文件都是UTF8的,这个文件也不例外。我在我的电脑上测试了这个文件,没有问题,然后就把这个文件传到SVN上了。
然后我同学下载了这个文件,不知为什么,他复制了这个文件的内容到剪贴板,然后用UltraEdit创建了一个文件,再从剪贴板把文件内容粘贴回去,保存。好,这回运行失败了,错误信息很典型,PHP默认情况下是关闭了输出缓冲的,所以偶在这个文件的第一行也写上了ob_start()来打开缓冲,这样在程序有了输出以后再想修改HTTP头也是可以的。但是现在不行了,第一行明明就是ob_start(),但是PHP就是报错,无法在输出内容以后再修改HTTP头信息。
太诡异了。

后来过了几天,终于发现这是UTF8编码的问题。UltraEdit创建的UTF8文件在文件开头会带有用来标识一个文件是UTF8编码的文件的几个字节(还是一个字节?偶忘记了),这几个字节是不会作为文件内容的,自然也不会在文本编辑器中显示出来。但是PHP在解析这个文件的时候,会首先输出这几个字节的UTF8编码标识,然后才执行ob_start(),显然这时候再缓冲也没用了,刚才的那几个字节已经作为普通的HTML内容发送给客户端了,于是就出现了内容已发送无法修改HTTP头的错误。
原因知道了,解决就简单了,在文本编辑器中去掉那个UTF标识字节就行了。

This entry was posted in 零零散散 and tagged , , . Bookmark the permalink.

7 thoughts on “PHP文件诡异的缓冲问题

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>