## 症状现象
登录或注册页的图形验证码不显示:图片位置一块空白或裂图图标,右键查看是一张加载失败的图。注册登录全部卡住,业务直接受影响。验证码图片是 PHP 动态生成的,不显示说明生成环节出错,方向集中在运行环境:GD 图形库、字体文件、缓存层,按序排查通常很快出结果。
## 第一步:验证 GD 扩展
验证码生成的根基是 PHP 的 GD 图形库,缺了它一切免谈。验证:
bash php -m | grep -i gd
没有输出就是没装或没启用:安装对应的 php-gd 包并重启 PHP-FPM。有输出还要看编译项:phpinfo 页面搜 GD 段落,确认 PNG 与 FreeType 支持都在。有些验证码库画的是带文字的图,FreeType 缺失时基础图形能画、文字画不出来,报错指向 imagettftext 函数未定义,装上 FreeType 相关包即解。
## 第二步:字体文件与权限
带文字扭曲的验证码需要一个字体文件,程序通常自带或依赖系统字体。检查两类问题:字体文件路径是否正确、文件是否存在,搬迁服务器或部署不完整时最容易丢;字体文件的读取权限是否足够,Web 进程读不到一样报错。PHP 的错误日志是关键线索,allowed memory exhausted、imagettftext 报错、file not readable 三类错误各自指向不同修复。
## 第三步:缓存导致的误判
代码与环境都正常仍不显示,怀疑缓存:浏览器缓存了之前的失败响应,强制刷新或无痕窗口验证;CDN 或页面缓存把验证码图片当静态资源缓存,每次返回同一张旧图,特征是刷新后图片不变。验证码接口的响应头应明确禁缓存,CDN 规则里把它排除。OPcache 缓存了旧代码的场景,部署后重置缓存再看。
**收尾。**修复后用无痕窗口完整走一遍注册登录流程确认。环境类问题的根源多在部署环节:php-gd 与字体包应写进环境清单,搬迁与重装后按单核对。顺云云服务器部署 PHP 站点时,把"验证码可显示"列入上线自检项,这类环境依赖问题在上线前拦截成本最低。