PHP验证码在Docker中不显示,主因是GD扩展未正确安装或启用、Session未初始化,或CLI与Web环境php.ini配置不一致。

PHP验证码字母在Docker里不显示,基本就是GD扩展没装对、没启全,或者Session没初始化——不是代码写错了,是容器里缺东西。
GD扩展没装或函数被禁用
验证码图片生成依赖 imagecreate、imagecolorallocate、imagestring、imagepng 这四个函数。只要其中任一缺失,就会空白或报错(比如 Call to undefined function imagecreate())。
- 进容器执行
php -m | grep gd,无输出说明扩展根本没加载 - 有输出但验证码仍空白?检查
php.ini的disable_functions里是否禁了上述函数 - Debian/Ubuntu 镜像需先装系统依赖:
libpng-dev、libjpeg-dev、libfreetype6-dev,再docker-php-ext-configure gd --with-jpeg --with-freetype,最后docker-php-ext-install gd - Alpine 镜像命令略有不同:
apk add libpng-dev libjpeg-turbo-dev freetype-dev,然后同样配置安装
GD装了但验证码还是空图
常见于 GD 编译时漏了字体支持,导致 imagettftext() 失败,而验证码类(如 ThinkPHP 或 Gregwar/Captcha)默认优先尝试 TTF 字体渲染。失败后可能静默回退到点阵字体,但某些精简镜像连点阵都不支持,就彻底白屏。
- 在 PHP 脚本里加一行
var_dump(gd_info());,确认输出数组中'FreeType Support'和'T1Lib Support'是true - Gregwar/Captcha 可强制禁用 TTF:
$builder = new CaptchaBuilder(null, false);第二个参数设为false就跳过字体加载 - ThinkPHP TP6 可在
config/captcha.php中设'driver' => 'gd'+'use_ttf' => false
Session未初始化导致 check() 总失败
验证码值(如 4aB9)存在 Session 里,前端只传用户输入。如果中间件没启动 Session,check() 永远读不到真实值,返回 false;更隐蔽的是,生成端可能也不报错,只输出空白图片——因为 GD 渲染成功了,但 Session 写不进去,后续校验就断链。
- ThinkPHP 需确认已启用
SessionInit中间件(TP6 在app/middleware.php里注册) - Docker 容器中 Session 存储路径若指向宿主机不存在的目录(如
/var/lib/php/sessions),也会静默失败;可改用redis或memcached驱动规避 - 快速验证:在生成验证码前加
session_start(); var_dump($_SESSION);,看是否可读写
最常被忽略的一点:CLI 和 Web SAPI 加载的 php.ini 不同。你在终端跑 php -m 看到 GD,不代表 Apache 或 FPM 进程也加载了它——务必检查 phpinfo() 页面里的 “Loaded Configuration File” 路径,并确认该 ini 文件里有 extension=gd 且没被注释。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











