最近在项目里遇到的一个非常诡异的bug,用PHP输出图像内容,图像总是损坏的状态,与原始图像比较之后,发现在文件的开头总会多输出一个0A字节,也就是回车,导致文件被破坏显示不出来。

经过一阵艰苦的排查和大量google之后,终于推断出问题可能出在某处的php里多输入了几个回车键,最终导致输出多了一个回车。Google的搜索结果中有人提到,在<?php 之前 和?>之后如果有多余的回车空行,就会出现类似的问题。写了一个简单的测试代码,发现只要加上引用php的代码,就会多输出回车,最终确定是在requireonce引用的php中有某一个多写了几个回车 --!

从网上找了一段代码,修改了一些,写了一个小脚本,遍历所有的文件找出哪些文件在?>结束符还有多余的回车空行,总算找到了元凶,删掉空行之后,问题解决。

[php] <?php //遍历所有文件 function find_allfile(){ $i=””; while($file=glob($i)){ foreach($file as $s){ if(!is_dir($s))$allfile[]=$s; } $i.=“/”; } return $allfile; } function find_enter(){ $file = find_allfile(); foreach ($file as $fname){ $fname=dirname(FILE).“/”.$fname; $content = @file_get_contents($fname); if(preg_match(‘/\?>\n+$/‘,$content)){ echo “find \n in file” .$fname.” “; }

}

} find_enter(); [/php]

把脚本放到根目录下,跑一遍就会把根目录和所有子目录里的文件都扫一遍,判断是不是有多余的空行。要判断文件开头有没有空行,把那个正则表达式稍微修改一下就可以。

另外,为防止出现这样的错误,在需要引用的php里面如果是纯php代码的话,最后的结束?>可以不写,这种情况php会自己处理代码最后的空行。