2020/4/27にWebPが公式にサポートされました
1よって、今となっては以下にあるような面倒なことをする必要はなくなりました。
ロリポップのレンタルサーバーで、JPEGやPNGの画像をWebP形式に変換したくてなんとかした話です。スタンダードプラン以上(SSH接続ができる)を前提としています。
ロリポップのPHPはimagewebp関数をサポートしていない
WebP変換?imagewebp関数使えば楽勝でしょ
と思っていたら...
Fatal error: Uncaught Error: Call to undefined function imagewebp()
で動きませんでした。phpinfo()で確認すると

ロリポップはWebPをサポートしていないことが分かりました。2
自前でWebPに変換できる環境を構築する
cwebpコマンドラインツールを利用することで、画像をWebP形式に変換することができます(A new image format for the Web | WebP | Google Developers)。つまり、cwebpをロリポップのサーバーで利用できるようにすれば解決です。
方針
ロリポップと同様の環境でビルドしたcwebpコマンドラインツールと必要なライブラリをロリポップのサーバーにコピーします。ロリポップのレンタルサーバーではmakeはおろかgccも利用できない(使用可能コマンド一覧 - ロリポップ)ため、レンタルサーバー上でビルドするのは不可能です。
ビルド環境の構築
ロリポップのレンタルサーバーと同様の環境をVirtualBoxで構築します。ポイントは**glibcのバージョンを合わせる**ことです。3
ロリポップサーバーのglibcのバージョンを確認
レンタルサーバーで
/lib64/libc.so*
を実行すると、
GNU C Library stable release version 2.12, by Roland McGrath et al.
のようにバージョンが表示されます(私の環境では2.12でした)。
CentOS 6のインストール
glibcのバージョンが2.12であるCentOS 6(64bit)環境をVirtualBoxで構築します。レンタルサーバーがCentOSである5ためOSもそれに合わせます。
VirtualBoxでの環境構築の方法はここでは詳述しません。かなりざっくりと説明すると
- VirtualBoxのインストール
-
Download - CentOSのx86_64のリンクからCentOS 6.10(64bit)をダウンロード(
aria2を使うと高速にダウンロードできるのでおすすめです6。) - ダウンロードしたISOでCentOSをインストール
という流れです。私はGUIなしでSSHを有効にして利用しました。
cwebpのビルド
VirtualBoxのCentOSでビルドを行います。だいたいのことはCompiling the Utilities | WebP | Google Developersに書いてあります。
必要なパッケージのインストール
これがないとビルドしても入力画像が読み込めません。
sudo yum install libjpeg-devel libpng-devel
ソースのダウンロード・展開
libwebp-1.0.3.tar.gzをdownloads listからダウンロードして下記で展開
tar xvzf libwebp-1.0.3.tar.gz
ビルド
後でレンタルサーバーにアップロードする際の手間を考慮し、ホームディレクトリ(~/bin/libwebp-1.0.3)にインストールします。
cd libwebp-1.0.3
./configure --prefix=$HOME/bin/libwebp-1.0.3
make
make install
ロリポップサーバーで実行できるようにする
必要なファイルのコピー
下記のファイルをレンタルサーバーのホームディレクトリにコピーします。
| ローカル(VirtualBox) | レンタルサーバー | |
|---|---|---|
~/bin/libwebp-1.0.3/bin/cwebp |
→ | ~/usr/bin/cwebp |
~/bin/libwebp-1.0.3/lib/libwebp.so.7.1.0 |
→ | ~/usr/lib/libwebp.so.7.1.0 |
~/bin/libwebp-1.0.3/lib/libwebpdemux.so.2.0.6 |
→ | ~/usr/lib/libwebpdemux.so.2.0.6 |
シンボリックリンクの作成
ライブラリのシンボリックリンクを作成します。
cd ~/usr/lib
ln -s libwebp.so.7.1.0 libwebp.so.7
ln -s libwebpdemux.so.2.0.6 libwebpdemux.so.2
環境変数の設定
cwebpと、それが利用するライブラリを見つけられるようにパスを通します。
cd ~
vi .bash_profile
Insertキーで挿入モードに入り、下記の内容を追加します。
export PATH=~/usr/bin:$PATH
export LD_LIBRARY_PATH=~/usr/lib:$LD_LIBRARY_PATH
編集後、Escキーでコマンドモードに入り:wqで保存して終了します。下記コマンドで.bash_profileを再読み込みすることでパスが通った状態になります。今後は、SSHでログインすれば自動的にパスが通ります。
source ~/.bash_profile
試しにcwebpを実行して下記のような表示になっていればOKです。
Usage:
cwebp [options] -q quality input.png -o output.webp
where quality is between 0 (poor) to 100 (very good).
Typical value is around 80.
Try -longhelp for an exhaustive list of advanced options.
もしライブラリが見つからない旨のエラーが出た場合は、ローカル環境の~/bin/libwebp-1.0.3/lib/を参考にしてレンタルサーバーにライブラリをコピーすればよいでしょう。
PHPからの利用
PHPから利用する場合も、~/.bash_profileと同様に環境変数をセットする必要があることに注意してください。環境変数は~/bin/...ではなく、ルートからの絶対パス(/home/users/...のようなパス、pwdコマンドで確認できます)で指定します。
-
サポートに問い合わせてみたところ、現時点(2019.03.26)でWebP対応の予定はないとのお返事でした。
今後に期待したいところです。↩ -
試しにPrecompiled WebP utilitiesをダウンロードしてロリポップサーバーで動かすと、
cwebp: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by cwebp)となって動かないことが分かります。4 ↩ -
レンタルサーバーでglibcのバージョンを変えれば...と思う人もいるかもしれませんが、多くのプログラムがglibcに依存しているため不可能です。無理にやるとあらゆるコマンドが無効になり詰みかけます(参考: [Solved] relocation error: /lib64/libc.so.6: symbol _dl_starting_up 解決法 - Qiita)。 ↩