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)。 ↩