验证码不显示通常因gd库未启用、输出缓冲被污染或bom头存在;需检查php.ini中gd/mbstring扩展、清除前置输出、验证url直访结果,并按tp版本安装对应captcha扩展及配置。

验证码不显示,通常不是代码写错了,而是环境或输出流程卡在了某一步。重点先查 GD 库、输出缓冲和 BOM 头这三项,80% 的问题出在这儿。
确认 PHP 已启用 GD 和 mbstring 扩展
ThinkPHP 验证码依赖 GD 库绘图,中文验证码还需 mbstring 处理字符:
- 打开 php.ini,检查并取消注释这两行(TP6/TP8 要求 GD + openssl,TP5 还要 mbstring):
extension=gd
extension=mbstring - Windows 下还要确认 extension=php_gd2.dll 已启用(旧版 TP5)
- 改完重启 Web 服务(Apache/Nginx/PHP 内置服务),然后运行 php -r "var_dump(gd_info()['png_support']);" 确认返回 true
清除前置输出(尤其 BOM 和空格)
验证码图片是二进制流,任何提前输出(哪怕一个空格或 UTF-8 BOM)都会导致图片损坏,显示为小叉或空白:
- 控制器中生成验证码的方法开头加 ob_end_clean();(TP5 常见写法)
- 所有 PHP 文件保存为 UTF-8 无 BOM 格式(用 VS Code、Notepad++ 等工具检查并转换)
- 检查配置文件、公共函数文件、路由定义等是否在 session_start() 或验证码执行前有 echo/print 输出
验证入口地址是否可直接访问
别只看页面,直接在浏览器打开验证码 URL,能快速定位是路径还是逻辑问题:
- 例如访问 http://yoursite.com/index.php/captcha 或 http://yoursite.com/index.php/Index/verify(按你实际路由调整)
- 如果显示小叉、报错或纯文本(如“PNG”乱码),说明 GD 或输出被污染
- 如果返回 404,检查路由是否注册、控制器方法是否 public、命名空间是否正确(TP6/TP8 注意命名空间和 use 声明)
TP6/TP8 必须安装独立扩展
TP6 和 TP8 不再内置 Verify 类,必须用官方 captcha 扩展:
- 运行 composer require topthink/think-captcha
- 手动创建 config/captcha.php,至少包含基础配置(缺配置文件会报 Class not found)
- 模板中改用助手函数:{:captcha_img()} 或 {:captcha_src()},不要硬写 URL
- 中文验证码需额外配 'useZh'=>true、'zhset' 和真实存在的中文字体路径(如 simhei.ttf)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











