PHP GDのbundled版・非bundled版の挙動の違いの検証 その1(確認環境構築・ソースコンパイル編)
PHPをインストールする際に
・OS標準のリポジトリから入れる場合
・ソースをコンパイルして入れる場合
・remi等の外部リポジトリから入れる場合
という方法が考えられるが、入れ方によってPHP GDがbundled版になるかどうかが変わってしまう。
挙動に影響が無ければ別にいいのだが、どうもそうはいかないみたいなので確認した結果を記録しておく。
そもそもなぜこんなことを調べたのかというと、開発環境と本番環境でPHPのバージョンが同じなのに本番環境でだけ想定通りに動かないということが起こったから。
具体的に書くと
ケース1(PHP5.6)
imagecreatefromjpeg関数でPNG画像を開いた際に
■開発環境(AmazonLinux、bundled版GD)
以下のWarningを吐きつつfalseを返してくる。
PHP Warning: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error: in ・・・
■本番環境(CentOS6、非bundled版GD)
以下のFatal errorを吐いて落ちる・・・。
PHP Fatal error: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error: Not a JPEG file: starts with 0x89 0x50 in ・・・
ケース2(PHP7.3)
imagecreatefromjpeg関数で破損した画像を開いた際に
■開発環境(AmazonLinux、bundled版GD)
以下のWarningを吐きつつfalseを返してくる。
Warning: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Premature end of JPEG file in ・・・
Warning: imagecreatefromjpeg(): ・・・ is not a valid JPEG file in ・・・
■本番環境(CentOS7、非bundled版GD)
開発環境と同様のWarningを吐きつつリソースIDを返してくる。
このどちらのケースも開発環境はソースからコンパイルしてインストール、本番環境はremiリポジトリからインストールした状態で発生し、
いろいろ調べていく中でどうもGDがbundle版かどうかに違いがありそうだと気づいたので、本腰を入れて調べてみた。
なお、ケース1の方は今回再現ができなかった。
ケース1は2017年初頭にPHP5.6.27にて確認していたが、
https://bugs.php.net/bug.php?id=73116
これを見るとimagecreatefromjpegに空のファイルを渡すとFatalで落ちる件の対処が行われているみたいなので、もう起こらないのかもしれない。
GDがbundled版かそうでないかを確認するにはphpinfo()で出力した中のGDセクションを見れば判断できる。
■bundled版
「GD Version」のところに「bundled」と書いてある。
■非bundled版
「GD Version」が無く、代わりに「GD headers Version」と「GD library Version」の行がある。
bundledの文字はナシ。
まずは検証のための環境作りから。
今回はPHP5.3、5.4、5.5、5.6、7.0、7.1、7.2、7.3、7.4の各バージョンを
ソースをコンパイル、remiリポジトリ、iusリポジトリ、AmazonLinux2のamazon-linux-extrasリポジトリ、CentOS8のAppStreamリポジトリの経路でインストールして確認をした。
また、参考としてCentOS6・7とAmazonLinux無印・2の標準で入るバージョンでも確認をした。
5.3 | 5.4 | 5.5 | 5.6 | 7.0 | 7.1 | 7.2 | 7.3 | 7.4 | |
ソースをコンパイル | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 |
remiリポジトリ | × | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 |
iusリポジトリ | × | × | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 | 実施 |
amazon-linux-extrasリポジトリ | × | × | × | × | × | × | 実施 | 実施 | 実施 |
AppStreamリポジトリ | × | × | × | × | × | × | 実施 | 実施 | × |
CentOS6標準 | 実施 | × | × | × | × | × | × | × | × |
CentOS7標準 | × | 実施 | × | × | × | × | × | × | × |
AmazonLinux標準 | 実施 | × | × | × | × | × | × | × | × |
AmazonLinux2標準 | × | 実施 | × | × | × | × | × | × | × |
実施となっているところが今回確認したパターンで、×になっているところは提供されていなさそうなので断念した。
ソースコンパイル環境の作成
まっさらなAmazonLinux2環境を用意したところからスタートする。
まずはrootに成り上がりコンパイルに必要なライブラリー類をインストールする。
sudo su -
yum -y install httpd httpd-devel
yum -y install patch
yum -y install gcc
yum -y install re2c
yum -y install libxml2 libxml2-devel
yum -y install openssl-devel
yum -y install bzip2 bzip2-devel
yum -y install libcurl-devel
yum -y install libjpeg-devel
yum -y install libpng-devel
yum -y install libicu-devel
yum -y install gcc-c++
yum -y install libmcrypt libmcrypt-devel
yum -y install readline readline-devel
yum -y install libtidy libtidy-devel
yum -y install libxslt libxslt-devel
yum -y install autoconf
yum -y install libtool-ltdl libtool-ltdl-devel
yum -y install sqlite-devel
yum -y install oniguruma oniguruma-devel
PHP5.3
cd /usr/local/src
wget https://www.php.net/distributions/php-5.3.29.tar.gz
tar -zxvf php-5.3.29.tar.gz
cd php-5.3.29
./configure \
--prefix=/usr/local/lib/php5.3 \
--with-gd \
--with-jpeg-dir=DIR \
--with-png-dir=DIR
make -j
make install
/usr/local/lib/php5.3/bin/php -v
PHP 5.3.29 (cli) (built: Aug 20 2020 00:32:27)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
PHP5.4
cd /usr/local/src
wget https://www.php.net/distributions/php-5.4.45.tar.gz
tar -zxvf php-5.4.45.tar.gz
cd php-5.4.45
./configure \
--prefix=/usr/local/lib/php5.4 \
--with-gd \
--with-jpeg-dir=DIR \
--with-png-dir=DIR
make -j
make install
/usr/local/lib/php5.4/bin/php -v
PHP 5.4.45 (cli) (built: Aug 20 2020 00:37:21)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
PHP5.5
cd /usr/local/src
wget https://www.php.net/distributions/php-5.5.38.tar.gz
tar -zxvf php-5.5.38.tar.gz
cd php-5.5.38
./configure \
--prefix=/usr/local/lib/php5.5 \
--with-gd \
--with-jpeg-dir=DIR \
--with-png-dir=DIR
make -j
make install
/usr/local/lib/php5.5/bin/php -v
PHP 5.5.38 (cli) (built: Aug 20 2020 00:40:41)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
PHP5.6
cd /usr/local/src
wget https://www.php.net/distributions/php-5.6.40.tar.gz
tar -zxvf php-5.6.40.tar.gz
cd php-5.6.40
./configure \
--prefix=/usr/local/lib/php5.6 \
--with-gd \
--with-jpeg-dir=DIR \
--with-png-dir=DIR
make -j
make install
/usr/local/lib/php5.6/bin/php -v
PHP 5.6.40 (cli) (built: Aug 20 2020 00:42:56)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
PHP7.0
cd /usr/local/src
wget https://www.php.net/distributions/php-7.0.33.tar.gz
tar -zxvf php-7.0.33.tar.gz
cd php-7.0.33
./configure \
--prefix=/usr/local/lib/php7.0 \
--with-gd \
--with-jpeg-dir=DIR \
--with-png-dir=DIR
make -j
make install
/usr/local/lib/php7.0/bin/php -v
PHP 7.0.33 (cli) (built: Aug 20 2020 00:45:21) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
PHP7.1
cd /usr/local/src
wget https://www.php.net/distributions/php-7.1.33.tar.gz
tar -zxvf php-7.1.33.tar.gz
cd php-7.1.33
./configure \
--prefix=/usr/local/lib/php7.1 \
--with-gd \
--with-jpeg-dir=DIR \
--with-png-dir=DIR
make -j
make install
/usr/local/lib/php7.1/bin/php -v
PHP 7.1.33 (cli) (built: Aug 20 2020 00:47:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
PHP7.2
cd /usr/local/src
wget https://www.php.net/distributions/php-7.2.32.tar.gz
tar -zxvf php-7.2.32.tar.gz
cd php-7.2.32
./configure \
--prefix=/usr/local/lib/php7.2 \
--with-gd \
--with-jpeg-dir=DIR \
--with-png-dir=DIR
make -j
make install
/usr/local/lib/php7.2/bin/php -v
PHP 7.2.32 (cli) (built: Aug 20 2020 00:50:53) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
PHP7.3
cd /usr/local/src
wget https://www.php.net/distributions/php-7.3.20.tar.gz
tar -zxvf php-7.3.20.tar.gz
cd php-7.3.20
./configure \
--prefix=/usr/local/lib/php7.3 \
--with-gd \
--with-jpeg-dir=DIR \
--with-png-dir=DIR
make -j
make install
/usr/local/lib/php7.3/bin/php -v
PHP 7.3.20 (cli) (built: Aug 20 2020 00:53:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.20, Copyright (c) 1998-2018 Zend Technologies
PHP7.4
cd /usr/local/src
wget https://www.php.net/distributions/php-7.4.8.tar.gz
tar -zxvf php-7.4.8.tar.gz
cd php-7.4.8
./configure \
--prefix=/usr/local/lib/php7.4 \
--enable-gd \
--with-jpeg
make -j
make install
/usr/local/lib/php7.4/bin/php -v
PHP 7.4.8 (cli) (built: Aug 20 2020 00:59:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
これでソースからコンパイルしたPHPが一通り揃った。