thinkphp6验证码在windows下不显示,90%以上是gd未启用或freetype不支持、字体路径非法、bom/空格污染输出、session中间件未开启所致;需依次验证gd_info()['freetype support']为true、改用dejavusans.ttf并设无bom编码、ob_clean()清除缓冲、启用sessioninit中间件且runtime可写。

ThinkPHP6 验证码在 Windows 10/11 下不显示,90% 以上不是代码写错,而是环境配置或输出干扰导致。重点排查 GD 扩展、字体路径、BOM 头和 Session 中间件这四类问题。
确认 GD 扩展已启用且支持 FreeType
TP6 验证码依赖 imagettftext() 渲染文字,该函数必须满足两个条件:GD 扩展已加载,且 FreeType 支持为 true。
- 运行
php -m | findstr gd(Windows 命令行),确认输出含gd - 运行
php -r "var_dump(gd_info()['FreeType Support']);",结果必须是 bool(true);若为 false,说明 GD 编译时未链接 FreeType - Windows 下 PHP 通常使用预编译二进制包,需检查
php.ini中是否启用了extension=gd(去掉分号),并确保php_gd2.dll文件存在于ext/目录 - 重启 Apache 或 Nginx 后,用
phpinfo()页面搜索 “GD” 和 “FreeType”,双重验证
替换默认中文字体并校验路径权限
TP6 默认使用 simhei.ttf,但 Windows 系统下该字体常因编码、权限或缺失导致 imagettftext() 静默失败——只出空白背景或一条横线。
- 推荐改用开源无版权字体
DejaVuSans.ttf(可从 fonts.google.com 下载) - 将字体文件放入
public/static/font/(如不存在请手动创建),设为 UTF-8 无 BOM 编码保存 - 在验证码配置中显式指定路径:
config/captcha.php'font' => public_path('static/font/DejaVuSans.ttf') - 确保 Web 进程用户(如 Apache 的
SYSTEM,Nginx 的www-data或当前运行用户)对该 .ttf 文件有读取权限(右键 → 属性 → 安全 → 检查)
清除输出缓冲污染(BOM/空格/错误提示)
验证码输出的是纯二进制图像流,前面哪怕一个空格、UTF-8 BOM 或 PHP Notice 都会让浏览器解析失败,表现为小叉号、黑块或“损坏的图像”。
- 用 VS Code 或 Notepad++ 打开
public/index.php、控制器文件、验证码调用文件,保存为 UTF-8 without BOM - 在生成验证码的方法(如
CaptchaController@index)开头添加:ini_set('display_errors', 'off');<br> ob_clean(); - 禁用所有可能提前输出的内容:删除文件首尾空行、注释前空格、echo/var_dump 调试语句
- 临时访问
http://yoursite.com/captcha,用浏览器开发者工具查看响应头(Content-Type 应为image/png)和响应体(不应含 HTML 或文本)
启用 Session 中间件并检查 runtime 权限
验证码生成与校验都依赖 Session 存储,TP6 默认不自动开启 Session 中间件,会导致图片能显示但始终验证失败,或干脆不显示。
- 打开
app/middleware.php,确保\think\middleware\SessionInit::class未被注释 - 检查
runtime/目录是否可写:右键 → 属性 → 安全 → 当前 Web 用户(如 IIS_IUSRS、SYSTEM 或 www-data)需有“修改”权限 - 确认
config/session.php中'type'为'file'(默认),且'path'指向可写目录(如runtime/session) - 若使用 Apache + mod_php,注意 Windows 下 session.save_path 默认指向
C:\Windows\Temp,需确保该路径可写;也可在php.ini中改为session.save_path = "D:/your_project/runtime/session"
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











