起因
今天使用 topthink/think-captcha 生成验证码的时候,提示这个错误。
Call to undefined function think\captcha\imagettftext()
查阅资料发现,是因为php没有使用gd库导致的。
解决方法
在docker容器中依次运行下面的代码
换源
这里如果网络没有问题的话可以不换。
# 先做备份
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 依次执行下面的代码将软件源切换成163
echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib" >/etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ stretch-proposed-updates main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ stretch main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ stretch-proposed-updates main non-free contrib">>/etc/apt/sources.list
# 更新软件源
apt update
安装gd库
注意编译的时候请选择适合自己php版本的代码进行编译 这里我只测试了7.4的
# 安装各种库
apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
# 解压源码
docker-php-source extract
# 进入gd源码文件夹
cd /usr/src/php/ext/gd
# 准备编译
# php 7.2 以下
docker-php-ext-configure gd --with-webp-dir=/usr/include/webp --with-jpeg-dir=/usr/include --with-png-dir=/usr/include --with-freetype=/usr/include/freetype2
# php 7.2-7.3
docker-php-ext-configure gd --with-webp=/usr/include/webp --with-jpeg=/usr/include --with-png=/usr/include --with-freetype=/usr/include/freetype2
# php 7.4
docker-php-ext-configure gd --with-webp=/usr/include/webp --with-jpeg=/usr/include --with-freetype=/usr/include/freetype2
# 编译安装
docker-php-ext-install gd
完成
# 检查扩展是否安装成功
php -m | grep gd
如安装成功,重启一次docker或重启一次php项目即可正常使用。