在服务器里,通过php -m命令可以查看到gd这个模块,可是程序里用到imagecreatefromjpeg函数还是报错,如下所示:
这是因为gd扩展,没有安装jpeg这部分。
通过phpinfo查看,gd扩展部分的信息如下图所示:
可以看到gif、png、bmp,却就是看不到jpeg。
网上这个时候都会让你下载jpeg的源码包,然后再进行编译安装。
本人经过实践,在php8.0版本下,不用另外下载源码包。
进入php源码包的ext/gd目录,本人实践目录如下所示:
/opt/php-8.0.23/ext/gd
然后开始重新编译gd扩展,依次执行如下命令:
/usr/local/php7/bin/phpize ./configure --with-php-config=/usr/local/php7/bin/php-config --enable-gd --with-jpeg --with-freetype make && make install
由于本人服务器有安装多版本php,所以执行phpize命令用的绝对路径,否则编译版本信息容易匹配不上。
如果看到类似下面的提示,就说明扩展编译成功了,连so文件位置,提示里都告诉我们了。
Build complete. Don't forget to run 'make test'. Installing shared extensions: /usr/local/php7/lib/php/extensions/no-debug-non-zts-20200930/ Installing header files: /usr/local/php7/include/php/
另外提一下,freetype是跟字体相关的东东,验证码给背景图添加文字时会用到。例如这个函数:imagettftext
gd扩展编译好后,重启了php-fpm,可是phpinfo里却看不到gd模块了。
原因只是因为我本人重启php-fpm用错了命令。
正确:/usr/local/php7/sbin/php-fpm -c /etc/php.ini
错误:/usr/local/php7/sbin/php-fpm -c /usr/local/php7/etc/php-fpm.conf
成功了,gd模块信息就会增多了,如下所示:
编译gd时,报如下错误:
configure: error: Package requirements (zlib) were not met: No package 'zlib' found
即没找到zlib包。
下面还有一大串其它提示:
Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix.
可问题时,我有安装zlib,无论在php -m下还是phpinfo里,都可以看到这个模块。
所以要解决的问题就是:如何让服务器在编译gd扩展时,能够自己找到zlib。
经过简单了解,pkg config就是package config,告诉你包相关的一些信息,例如依赖哪些其他包,其他包的位置又在哪里等等。
通过命令
whereis pkgconfig
我得到如下位置:
pkgconfig: /usr/lib64/pkgconfig /usr/local/lib/pkgconfig /usr/share/pkgconfig
在/usr/lib64/pkgconfig目录里,我就发现了zlib.pc这个文件。(这个文件我估计就是安装zlib扩展时生成的)
-rw-r--r--. 1 root root 211 Oct 31 2018 xcb-xtest.pc -rw-r--r--. 1 root root 215 Oct 31 2018 xcb-xvmc.pc -rw-r--r--. 1 root root 210 Oct 31 2018 xcb-xv.pc -rw-r--r-- 1 root root 239 Oct 31 2018 zlib.pc
所以我们只要让服务器知道zlib.pc在哪里,它就自然能找到zlib在哪里了。
上面的错误提示就告诉我们解决方法了:通过配置环境变量PKG_CONFIG_PATH来解决。
最终我在/etc/profile下添加了如下一行,然后source /etc/profile生效,gd编译就畅通无阻了。
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:$PKG_CONFIG_PATH //本人添加的行,让系统能够发现zlib.pc