PHP验证码生成遇imagettftext无法找到同目录字体问题求助
问题描述
我试图在表单中实现验证码图像功能,表单代码如下:
<form class="login" method="POST" action=""> <p class="title">Are you human?</p> <div id="captchaimage"> <img src="generate.php"> </div> <input type="text" name="scr" size="6" placeholder="Write what you see here" autofocus/> <input class="submititon" type="submit" value="Submit" name="submit"></input> </form>generate.php文件代码:
<?php session_start(); //header('Content-type: image/jpeg'); $text = $_SESSION['scr']; $font_size = 26; $image_width = 100; $image_height = 40; $image = imagecreate($image_width, $image_height); imagecolorallocate($image,255,255,255); $text_color = imagecolorallocate($image,0,0,0); for($x=1;$x<=30;$x++){ $x1 = rand(1, 100); $y1 = rand(1, 100); $x2 = rand(1, 100); $y2 = rand(1, 100); imageline($image, $x1, $y1 ,$x2 ,$y2, $text_color); } imagettftext($image, $font_size, 0, 15, 30, $text_color, 'font.ttf', $text); imagejpeg($image); ?>注释header()后得到警告:
Warning: imagettftext(): Could not find/open font on line 25 Line 25: imagettftext($image, $font_size, 0, 15, 30, $text_color, 'font.ttf', $text);font.ttf已放在generate.php同一目录,但仍报错,请问原因是什么?
这个警告的核心问题是PHP无法定位到你的font.ttf文件,哪怕你把它放在generate.php同目录,也可能因为几个常见原因导致找不到:
1. PHP的工作目录并非你预期的路径
很多时候,PHP的当前工作目录(getcwd()返回的路径)不是generate.php所在的目录——比如如果你的表单页面是index.php,而generate.php是被index.php间接调用的,工作目录会是index.php的目录,而不是generate.php的。
解决办法:使用绝对路径引用字体文件,用__DIR__常量(代表当前脚本所在目录)来拼接路径,修改imagettftext的字体参数:
imagettftext($image, $font_size, 0, 15, 30, $text_color, __DIR__ . '/font.ttf', $text);
这样不管PHP的工作目录是什么,都能精准定位到字体文件。
2. 文件名大小写不匹配
如果你的服务器是Linux/Unix系统(绝大多数线上服务器都是),文件名是严格区分大小写的。比如你代码里写的是font.ttf,但实际文件是Font.ttf或者FONT.TTF,就会导致找不到。
解决办法:确保代码里的文件名和实际文件的大小写完全一致,最好统一用小写命名。
3. 字体文件权限不足
Web服务器的运行进程(比如www-data、apache)需要有读取font.ttf文件的权限,如果权限设置不对,PHP会无法访问该文件。
解决办法:
- 给字体文件设置可读权限:
chmod 644 font.ttf - 或者调整文件所属组为web服务器的组:
chown www-data:www-data font.ttf(根据你的服务器进程用户调整)
4. 字体文件实际不存在或路径错误
有时候你以为文件已经上传到服务器,但实际可能上传失败,或者路径有误。
解决办法:
- 直接通过浏览器访问字体文件的URL(比如
http://你的域名/path/to/font.ttf),如果能下载到文件,说明路径正确;如果404,说明文件没上传或者路径错了。 - 检查generate.php所在目录下是否真的存在font.ttf文件,可以通过服务器的文件管理器或者
ls命令查看。
内容的提问来源于stack exchange,提问作者user9162601

