tp6验证码生成失败主因是session未启用、输出缓冲干扰、接口场景session失效、url缓存及路由/输出错误;需启用session中间件、清理缓冲、改用cache存储、添加时间戳防缓存,并确保路由正确且无额外输出。

TP6验证码生成失败,常见原因不是代码写错,而是环境或配置卡在几个关键环节。下面直击问题核心,给出可落地的解决代码和操作要点。
Session未启用是头号原因
TP6默认不自动初始化Session,而验证码依赖Session存取原始值。没Session,图片能显示,但校验必失败。
- 打开 app/middleware.php,取消注释这一行:
\think\middleware\SessionInit::class,
- 确保 runtime/session 目录有写权限(Linux 下检查
/tmp或项目内 session 路径是否可写) - 若用 Redis 存 Session,确认配置正确且服务正常运行
验证码图片不显示?先清输出缓冲
PHP 文件开头存在空格、BOM头或意外输出,会导致 header 发送失败,图片变成乱码或空白。
- 在验证码输出方法中加
ob_clean()强制清理缓冲区:
public function captcha()<br>{<br> ob_clean();<br> return Captcha::create();<br>}
- 同时检查所有引入文件(尤其是 config/*.php、helper.php)是否含 BOM 或多余空行
接口调用场景下验证码总失败?改用缓存替代 Session
Vue/APP 直接请求 /captcha 接口时,不走浏览器 Cookie 机制,Session 失效。必须切换为 Cache 存储。
- 修改 vendor/topthink/think-captcha/src/Captcha.php
- 在
generate()方法中,将原 session 写入替换为:
Cache::set('captcha_' . $key, ['code' => $code], 300); // 5分钟过期
- 在
check($code)方法中,把读取逻辑改为:
$cacheKey = 'captcha_' . $key;<br>$data = Cache::get($cacheKey);<br>if ($data && strtolower($data['code']) === strtolower($code)) {<br> Cache::delete($cacheKey);<br> return true;<br>}
- 顶部补上:
use think\facade\Cache;
前端调用路径与缓存干扰
验证码 URL 被浏览器缓存,导致一直显示旧图,输入再对也失败。
- 模板中 img 标签加上时间戳防缓存:
<img src="%7B:captcha_src()%7D?t=%7B:time()%7D" alt="验证码" onclick="this.src='{:captcha_src()}?t='+Date.now()">
- 确认路由指向正确控制器方法(如
GET /captcha对应captcha()方法) - 避免在验证码方法里 echo/print 任何内容,只返回图像流











