ThinkPHP验证码不显示的解决方案

今天遇到一个很奇怪的BUG,就是我写了一个PHP程序本地运行正常,可是发布到甲方的服务器上出现没法显示验证码的BUG。php

图片描述

具体表现就是chorme浏览器上显示一个裂了的图片小图标,右键点击该图片在新窗口打开,仍然是一个裂了的小图片,并不是报错信息(开启xdebug扩展和php报错的状况下),若是是这样那么就说明验证码URL路由和业务逻辑代码没问题,是生成验证码的环节出问题了,个人Debug思路是这样的:浏览器

1.检查GD库是否安装正确,Linux推荐使用yum或者apt或者pecl等方式安装,Windows推荐使用phpStudy这个集成环境,他集成好了经常使用扩展,只需鼠标右键开启便可。(适用于验证码图片在新窗口打开的时候显示了报错信息以及一堆乱码的状况下,若是有报错信息,请根据报错信息进行debug)
图片描述服务器

2.检查验证码所调用的字体是否缺失。有部分验证码组件调用的字体在目标计算机上并未安装,这个须要分析验证码模块的源码观察。我用的是ThinkPHP官方的think-captcha,在vendortopthinkthink-captchasrc能够找到他的源码,在vendortopthinkthink-captchaassets这里能够看到这款验证码插件是自带了字体的,因此ThinkPHP的验证码基本上能够不用考虑字体问题,若是是别的验证码插件,那么仍是要检查一下这个地方的。运维

3.把有bug的验证码图片下载下来,以及本地测试正常的验证码图片下载下来,使用记事本查看而且对比。编辑器

图片描述

上图是本地环境的验证码图片的记事本,咱们使用更专业的16进制编辑器来分析一下文件差异。工具

图片描述

如图所示,咱们发现bad这个坏文件除了前面多了EF BB BF等数字之外,其余内容如出一辙,说明是PHP在渲染图片的时候多渲染了这些文字,至于缘由我猜想多是服务器上没有专业的代码编辑器,所以运维人员使用普通的Windows记事本修改了php代码致使多了这个BOM头部。性能

若是是第三种缘由,解决方法有两个,一个是在验证码的imagepng输出图片代码调用以前用ob_clean清除php的输出缓冲区。还有就是使用一些工具批量对代码的bom进行去除。测试

图片描述

我这里使用的是ob_clean,在think-captcha的主文件Captcha.php的第203行以前加上ob_clean(),这样一劳永逸。若是对性能和稳定性有严苛要求,建议仍是用工具批量去除bom比较保险。同时也建议你们随时在服务器上装一个editplus等专业的代码编辑器。不要用Windows的记事本修改代码。字体

相关文章
相关标签/搜索