画像処理 GD モジュールのWebP対応コンパイル

Chromeブラウザのみの対応だった WebP 画像が Edge, Firefox 等の最新版で使用できるようになってきています。8割近いブラウザで使えるようになってきたそうなので WebP に対応したく調べてみました

WebPが使用できれば、Jpg や PNG 画像より2~3割程度データサイズを小さくできるのでサイトの高速化が期待できます

Windows 上の XAMPP で試すと、既に GD の WebP サポートが行われていたのですぐに活用できる状態でした

ところが、Linux やレンタルサーバーのGDサポートを調べてみると WebP に対応していません (>_<)

ということで、Linux上でも GD で WebP をサポートしたくコンパイルしてみました

コンパイル環境の準備

先ずは、PHPをコンパイルするための環境の構築が必要です

構築した環境は Windowsの Vagrant で VAW を使っています

VAWには、PHPコンパイル環境が含まれていますのでこれだけで最初の準備はOKです

VAW(Vagrant Ansible WordPress) は、WordPress の 開発/テスト環境を構築する Ansible playbook です。Cent OS(64bit) を使い、Apache や Nginx サーバー、MySQL や Mariadb, percona データベース、 php バージョンの切り替え等を簡単に行えます。今回は、この環境を使って php-gd モジュールのコンパイルを行います

PHPのコンパイル

今回は PHP7.2.13 を使って作業していきます

VAWでは、PHP拡張モジュールが静的に組み込まれているので、GD モジュールを動的な 共有モジュールとしてコンパイル出来るように構築します

デフォルトコンフィグレーションの変更

拡張モジュールを静的に組み込むか、動的に組み込むかは、PHPをコンパイルする時のコンフィグレーションファイルで指定します

VAW(CentOS)内のデフォルトコンフィグレーションは下記ファイルです

"/home/vagrant/.phpenv/plugins/php-build/share/php-build/default_configure_options"

このコンフィグレーションファイルを直接修正しても良いのですが、今回は、WindowのVAWプロジェクト内の default_configure_options.j2 テンプレートファイルを修正して、プロビジョニング時に自動的に反映されるようにします

"C:/HashiCorp/Project/vaw/roles/phpenv/templates/default_configure_options.j2"

※VAWをインストールしたディレクトリによりパスは変わります

このテンプレートファイルに GDモジュールを動的に組み込むように下記修正を行います

--with-freetype-dir=/usr
--with-png-dir=/usr
--with-jpeg-dir=/usr
--with-webp-dir=/usr
--with-gd=shared

PHP7.4 だと指定が下記のように変更されているので注意

– GD:
. –with-gd becomes –enable-gd (whether to enable the extension at all) and
–with-external-gd (to opt into using an external libgd, rather than the
bundled one).
. –with-png-dir has been removed. libpng is required.
. –with-zlib-dir has been removed. zlib is required.
. –with-freetype-dir becomes –with-freetype.
. –with-jpeg-dir becomes –with-jpeg.
. –with-webp-dir becomes –with-webp.
. –with-xpm-dir becomes –with-xpm.

修正が終わったら vagrant up します(既に動作中なら vagrant provision )

起動したら下記ファイルの設定が書き換わっていることを確認します
"/home/vagrant/.phpenv/plugins/php-build/share/php-build/default_configure_options"

コンパイル

VAWでは、PHPバージョンを切り替える時にまだコンパイルされていなければ自動的にコンパイルして切り替えられます

PHPバージョン切り替えについては、下記記事を参考にして下さい

WPのPHP7動作確認は VAWの PHPバージョン切替え phpenv.sh がお勧め!
Vagrant VAW (Cent OS) 環境で PHPバージョン切り替えがとっても簡単に行える phpenv.sh シェルプログラムの使い方を紹介します。これで WordPress の PHP7 での動作確認も簡単に行えます (^^)
WPのPHP7動作確認は VAWの PHPバージョン切替え phpenv.sh がお勧め!

この記事のように、簡単に指定したPHPバージョンをコンパイルして切り替えることが出来ます

※VAWのバージョンアップにより上記記事から若干指定オプションが変わってます

それでは vagrant ssh で接続してコマンドラインから下記コマンドで PHP7.2.13 に切り替えます

/vagrant/command/phpenv.sh -v 7.2.13 -m mod_php -s tcp

エラーです (^_^;)

libzip 更新

libzip が古いので更新する必要があるらしい… ググります

PHP 7.2.1 導入 – eastforest
はじめに WordPress を Apache 2.4 + MySQL 5.7 + PHP7 の環境で構築。今回はPHPの内容になります。 対象バージョン バージョン PHP 7.2.1 最新バージョンは公 … “PHP 7.2.1 導入”の続きを読む

この記事を参考に以下のようにライブラリを更新します

# sudo yum install epel-release

# sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

libzip5-develをインストールします。

# sudo yum --enablerepo=remi,remi-php72 install libzip5-devel

確認

# yum list installed | grep libzip
libzip5.x86_64                  1.5.1-1.el7.remi                @remi
libzip5-devel.x86_64            1.5.1-1.el7.remi                @remi

競合している場合はremoveしてから再実行

# sudo yum remove libzip libzip-devel

再度、コンパイルしてみると別のエラー発生!

libwebp インストール

configure: error: webp/decode.h not found

WebP関係のヘッダーファイルが必要といっていますので同様に libwebp をインストールします

# sudo yum --enablerepo=epel install libwebp libwebp-devel libwebp-tools

ついでに freetype もインストールしておきます

# sudo yum --enablerepo=epel install freetype freetype-devel

これでコンパイルするとようやくエラーが消えコンパイルできました

コンパイルモジュールは、”/home/vagrant/.phpenv/versions/7.2.13/lib/php/extensions/no-debug-non-zts-20170718″ ディレクトリに gd.so で生成されてます

何かエラーが出たらメッセージを元に yum search [キーワード]で不足しているパッケージが推定できることが多いので yum でそれらをインストールしていけばOK

php.ini ファイルで拡張モジュールロード

生成した拡張モジュールはまだ組み込まれていませんので、下記の php.ini ファイルで extension をロードするように追記する必要があります

“/home/vagrant/.phpenv/versions/7.2.13/etc” 下の php.ini の 900行辺りに下記を追記します

extension="/home/vagrant/.phpenv/versions/7.2.13/lib/php/extensions/no-debug-non-zts-20170718/gd.so"

sudo systemctl restart httpd.service コマンドを入力してサーバーを再スタートさせます

ドキュメントルートに phpinfo.php 下記内容で作成

<? PHP phpinfo(); ?>

これでブラウザから phpinfo.php にアクセスして確認します

WebP サポートが有効化されました (^^)

今回は、PHP全体のコンパイルの一部として gd 拡張モジュールを生成してみました

gd のみをコンパイルする場合

単体でコンパイルする場合についても軽く紹介

gd拡張モジュールのソースコードは下記ディレクトリにあるので移動します

/tmp/php-build/source/7.2.13/ext/gd

phpize

ここで phpize というシェルプログラムを使って configure スクリプトを作成します

phppize は、config.m4 という拡張モジュールの構築情報を使って Makefile を作成するための configure シェルプログラムファイルを作成します

UNIX 用のビルドシステム: config.m4

拡張モジュールの config.m4 ファイルは、 UNIX のビルドシステムに対して「その拡張モジュールがサポートしている configure オプション」「依存する外部ライブラリ」 「コンパイル対象となるソースファイル」などの情報を伝えるものです。

それでは実行してみます

$ phpize

ls で確認すると configure が作成されているはずです

configure

先ほど作成した configure シェルプログラムにコンパイルオプションを指定して configure を実行します

コマンドラインからこのコンパイラオプションを指定して configure スクリプトを実行して Makefile を生成してみます

$ ./configure --with-freetype-dir=/usr --with-png-dir=/usr --with-jpeg-dir=/usr --with-webp-dir=/usr --with-gd=shared

同じ内容の指定だとphp7.4では下記のように指定

$ ./configure --with-freetype --with-jpeg=/usr --with-webp=/usr --enable-gd=shared

Makefile が生成されます

make

次は コマンドラインで make と入力して Makefile 条件に従ってコンパイルを行ってみます

実行すると gd.so 拡張モジュールが /tmp/php-build/source/7.2.13/ext/gd/modules 下に生成されます

make install

次は生成された gd.so を php7.2.13 の拡張モジュールフォルダーに配置して使えるようにする必要があります

make install と入力すると /home/vagrant/.phpenv/versions/7.2.13/lib/php/extensions/no-debug-non-zts-20170718 ディレクトリへコピーしてくれます

Vagrant環境ではこれでOKです

レンタルサーバーで動作するか?

上記と同じような作業をすれば WebP へ対応できるようになりますが、管理者権限がない場合は難しいです

レンタルサーバーでは通常は管理者権限がありませんのでその場合は別途方法を考える必要があります

エックスサーバーにgd.soモジュールを配置してみる

試しに私が利用しているエックスサーバーに作成した gd.so モジュールを読み込ませて見ましたが残念ながら WebP サポートは有効化しませんでした

ライブラリの libwebp がないためなのですが、管理者権限がないので libwebpインストールできません  orz

次回はレンタルサーバー(エックスサーバー)で WebP 画像を扱えるようにするために試行錯誤した体験等を紹介したいと思います

では (^^)


まとめ記事紹介

go-to-top