摘要:
最近在使用PHP做一个验证码生成的类库,意外的发现在Windows10系统下开发出现一个BUG,但是亲测在小于PHP7.2的情况下,此BUG不会影响,但是一旦你的PHP版本高于7.0就会造成下文中出现的报错信息.具体解决方案,本文也列出来,供大家一起学习。
简述
先来看下具体的报错信息如下图,估计也只有火狐浏览器才对开发者这么友好的提示了,其他大部分浏览器都是直接一张打着叉叉的图.
火狐报错:
谷歌报错:
解决思路
1.如果出现上面的报错信息,请检查你的配置环境问题(当然基本上很少出现问题)
2.字体库文件位置是否正确(正常都是放在项目同目录下),怎么判断?阁主是相同的代码和环境下只有在小于PHP7.2版本才不会出现报错.也就是说本质还是在某个代码段中出现了不兼容的情况,在不修改BUG的情况下,我上传到Linux服务器上,在PHP7.3中也是完美支持的.但是在Windows环境下,只要是大于PHP7.0的环境都会报错,也就是说确实是某个代码段不支持Windows环境.
3.由于上述情况,最后我将可能导致此问题的代码段逐一排查找了出来,最后问题是出在函数imagettftext()新版本的PHP(>7.0)可能存在某种玄学兼容的情况下导致的报错,由于起初我给字体库文件的是相对路径,后面想一下会不会在Windows下需要严格一点,需要指定绝对路径.最后果不其然,确实如此!问题解决.
解决方案
BUG出现问题:GD库加载字体文件时,需要提供绝对路径.
这里就直接贴解决的代码了,我的解决思路就是把原来赋值的相对路径使用函数realpath()转换为系统的绝对路径,在把绝对路径赋给imagettftext()函数.//引入字体相对路径
$font_face = './fonts/arialbd.ttf';
//为减少不必要的麻烦,字体路劲一定要使用绝对路径
//GD库加载字体文件时,需求提供绝对路径,路径用realpath()将相对路径转成绝对路径(目前测试PHP>7.0需要使用绝对路径)
$font_face = realpath($font_face);
imagettftext($img, mt_rand(16, 18), mt_rand(-10, 10), 8 + (18 * $i), 24, $font_color, $font_face, $text);
验证码生成正常:
忠告
1、字体路径问题:为减少不必要的麻烦,请一定要使用绝对路径
2、字体格式:建议使用ttf格式,ttc有可能在linux上不兼容。
3、安装GD库扩展,同时需要freetype扩展,并且是高版本,请安装2.3.11以上版本。
感谢您的支持,我会继续努力的!
扫码打赏,你说多少就多少
打开支付宝扫一扫,即可进行扫码打赏哦