目录

Docker中PHP7以上构建GD库并启用全部特性

GD库简介:

PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG, JPEG, WBMP 以及 XPM 在内的多种格式的图像。 更加方便的是,PHP 可以直接将图像数据流输出到浏览器。 要想在 PHP 中使用图像处理功能,你需要连带 GD 库一起来编译 PHP。 GD 库和 PHP 可能需要其他的库, 这取决于你要处理的图像格式。

你可以使用 PHP 中的图像函数来获取下列格式图像的大小: JPEG, GIF, PNG, SWF, TIFF 和 JPEG2000。

如果联合 exif 扩展 一起使用, 你可以操作存储在 JPEG 和 TIFF 图像文件头部的信息, 这样就就可以获取数码相机所产生的元数据。 exif 相关的函数不需要 GD 库亦可使用。

当前使用PHP版本:

1
2
3
4
$ php -v
PHP 7.3.11 (cli) (built: Nov 20 2019 09:01:17) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies

参考PHP手册GD库安装,直接在编译时指定 --with-gd 就可以启用GD扩展,所使用扩展源码来自于php源码/ext/gd文件夹,编译好后可以通过gd_info去查看GD库的版本和所支持的格式。

直接使用命令行运行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 $ php -r "print_r(gd_info());"
Array
(
    [GD Version] => bundled (2.1.0 compatible)
    [FreeType Support] =>
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPEG Support] =>
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] =>
    [XBM Support] => 1
    [WebP Support] =>
    [BMP Support] => 1
    [JIS-mapped Japanese Font Support] =>
)

可以看到使用的GD库版本为bundled (2.1.0 compatible),FreeType不支持,JPEG不支持,XPM不支持,WebP不支持,JIS-mapped Japanese Font不支持。

查阅PHP手册GD安装需求 可以看到:

GD库版本要求:

在 gd-2.0.28 中,提供了对 GIF 格式的支持。 Note: 要求 libgd-2.0.4 或更高版本, PHP 5.5 要求 libgd-2.1.0 或更高版本。 你也可以使用 PHP 中绑定的 GD 库。

你可能希望增强 GD 库以处理更多的图像格式。

图像格式 需要下载的库 备注
gif 仅在 gd-2.0.28 及更高版本的 GD 库提供支持, 从 PHP 5.0.1 开始支持 写入 操作。
jpeg » http://www.ijg.org/ 在构建 PHP 之前, 需要在配置步骤使用 –enable-shared 选项来构建 jpeg 库。 如果不使用此选项,那么在构建 PHP 时的配置环节, 会产生 libjpeg.(a|so) not found 的错误。
png » http://www.libpng.org/pub/png/libpng.html
xpm » ftp://metalab.unc.edu/pub/Linux/libs/X/!INDEX.html 如果你的系统中已经安装了 X 环境, 就已经包含这个库了。

你可能希望增强 GD 库来使用不同的字体。 下列字体库是受支持的:

字体库 下载 备注
FreeType 1.x » http://www.freetype.org/ PHP 5.3.0 开始,不再提供对 FreeType 1.x 的支持。
FreeType 2 » http://www.freetype.org/
T1lib » ftp://sunsite.unc.edu/pub/Linux/libs/graphics/) 支持 Postscript Type 1 字体(在 PHP 7.0.0 中移除)。

查阅PHP手册GD安装可以看到:(这个地方看英文版的手册,中文版手册翻译和英文不同步,2019-12-17)

Image Format Configure Switch
jpeg To enable support for jpeg add –with-jpeg-dir=DIR . Jpeg 6b, 7 or 8 are supported.
png To enable support for png add –with-png-dir=DIR . Note, libpng requires the zlib library, therefore add –with-zlib-dir[=DIR] to your configure line.
xpm To enable support for xpm add –with-xpm-dir=DIR . If configure is not able to find the required libraries, you may add the path to your X11 libraries.
webp To enable support for webp add –with-vpx-dir=DIR . Available as of PHP 5.4.0. As of PHP 7.0.0 –with-webp-dir=DIR has to be added, i.e. support for libvpx has been removed in favor of libwebp.

Note: When compiling PHP with libpng, you must use the same version that was linked with the GD library.

Enhance the capabilities of GD to deal with different fonts by specifying the –with-XXXX configure switch to your PHP configure line.

Font library Configure Switch
FreeType 2 To enable support for FreeType 2 add –with-freetype-dir=DIR . As of PHP 7.4.0 use –with-freetype instead, which relies on pkg-config.
T1lib To enable support for T1lib (Postscript Type 1 fonts) add –with-t1lib[=DIR] (Removed as of PHP 7.0.0).
Native TrueType string function To enable support for native TrueType string function add –enable-gd-native-ttf . (Effectless as of PHP 5.5.0; removed as of PHP 7.2.0.)

所以PHP7以上还可以支持的格式为 FreeType 2jpegxpmwebp支持。

编译时可以使用的配置项如下

–with-jpeg-dir=DIR

–with-png-dir=DIR

–with-xpm-dir=DIR

–with-webp-dir=DIR

–with-freetype-dir=DIR

–with-freetype (PHP7.4用这个)

下面这些不要使用,已经移除

–with-vpx-dir=DIR

–with-t1lib[=DIR]

–enable-gd-native-ttf

编译GD库

使用的基础镜像是7.3.11-fpm-alpine3.10,如果是不是基于alpine系统的,区别就是包名可能有点区别。

安装依赖

// *-dev 编译后可以删除

gd-dev libjpeg-turbo-dev libpng-dev libxpm-dev libwebp-dev freetype-dev

// 运行时依赖不可以删除

gd libjpeg-turbo libpng libxpm libwebp freetype

libjpeg-turbo最初是是基于libjpeg来的,速度比libjpeg快,所以一般都使用libjpeg-turbo。

Dockerfile:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
FROM php:7.3.11-fpm-alpine3.10

RUN \
# 安装构建依赖包
apk add --no-cache --virtual .gd-build-deps \
    gd-dev \
	libjpeg-turbo-dev \
	libpng-dev \
	libxpm-dev \
	libwebp-dev \
	freetype-dev \
# 安装运行依赖包
&&  apk add --no-cache \
    gd \
	libjpeg-turbo\
    libpng \
    libxpm\
    libwebp \
    freetype \
# 完善的GD库扩展安装,开启GD库,支持FreeType,GIF,JPEG,PNG,WBMP,XPM,XBM,WebP,BMP
&&  docker-php-ext-configure gd \
    --with-gd=/usr \
    --with-jpeg-dir=/usr \
    --with-png-dir=/usr \
    --with-freetype-dir=/usr \
    --with-xpm-dir=/usr \
    --with-webp-dir=/usr \
&&  docker-php-ext-install gd \
# 清理依赖
&&  apk del --no-network .gd-build-deps

查看编译后gd信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ php -r "print_r(gd_info());"
Array
(
    [GD Version] => 2.2.5
    [FreeType Support] => 1
    [FreeType Linkage] => with freetype
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPEG Support] => 1
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] => 1
    [XBM Support] => 1
    [WebP Support] => 1
    [BMP Support] => 1
    [JIS-mapped Japanese Font Support] =>
)

使用两个apk add 是方便最后清理依赖。这里的gd使用的不是/usr/src/php/ext/gd,而是apk add 的gd库,所以版本是2.2.5,比一开始打印的bundled (2.1.0 compatible)要新。

JIS-mapped Japanese Font Support我看网上说中文时可能会有乱码情况,还是不开启,具体的没测过,而且网上说的参数我在手册上没有找到。

PHP英文版的手册,中文版手册翻译和英文不同步,所以有问题时,建议看看英文版是最新的。

https://assets.cooldev.cn/2019-12-16_175106.png@!p