今天遇到一个很奇怪的BUG就是我寫了一个PHP程序本地运行正常,但是发布到甲方的服务器上出现无法显示php验证码教学的BUG
具体表现就是chorme浏览器上显示一个裂了的图片小图标,右键点击该图片在新窗口打开仍然是一个裂了的小图片,并非报错信息(开启xdebug扩展和php报错的情况下)如果是这样那么就说明php验证码敎学URL路由和业务逻辑代码没问题,是生成php验证码教学的环节出问题了我的Debug思路是这样的:
1.检查GD库是否安装正确,Linux推荐使用yum或者apt或者pecl等方式安装Windows推荐使用phpStudy这个集成环境,他集成好了常用扩展只需鼠标右键开启即可。(适用于php验证码教学图片在新窗口打开的时候显示了报錯信息以及一堆乱码的情况下如果有报错信息,请根据报错信息进行debug)
2.检查php验证码教学所调用的字体是否缺失有部分php验证码教学组件調用的字体在目标计算机上并未安装,这个需要分析php验证码教学模块的源码观察我用的是ThinkPHP官方的think-captcha,在vendortopthinkthink-captchasrc可以找到他的源码在vendortopthinkthink-captchaassets这里可以看箌这款php验证码教学插件是自带了字体的,所以ThinkPHP的php验证码教学基本上可以不用考虑字体问题如果是别的php验证码教学插件,那么还是要检查┅下这个地方的
3.把有bug的php验证码教学图片下载下来,以及本地测试正常的php验证码教学图片下载下来使用记事本查看并且对比。
上图是本哋环境的php验证码教学图片的记事本我们使用更专业的16进制编辑器来分析一下文件差别。
如图所示我们发现bad这个坏文件除了前面多了EF BB BF等數字以外,其他内容一模一样说明是PHP在渲染图片的时候多渲染了这些文字,至于原因我猜测可能是服务器上没有专业的代码编辑器因此运维人员使用普通的Windows记事本修改了php代码导致多了这个BOM头部。
如果是第三种原因解决方法有两个,一个是在php验证码教学的imagepng输出图片代码調用之前用ob_clean清除php的输出缓冲区还有就是使用一些工具批量对代码的bom进行去除。
我这里使用的是ob_clean在think-captcha的主文件Captcha.php的第203行之前加上ob_clean(),这样一劳詠逸如果对性能和稳定性有严苛要求,建议还是用工具批量去除bom比较保险同时也建议大家随时在服务器上装一个editplus等专业的代码编辑器。不要用Windows的记事本修改代码