ローカルの仮想サーバにWordPressの本番環境(このブログ)を再現(コピー)しようとしていたときのお話。
不要な画像をサーバからも削除する、あるいは新しく定義したサイズの画像を生成することも作業に含まれていました。
ところが、削除はできても画像の生成に失敗し、その理由がわからず2週間近く悩まされました。
その問題を解決した”GDモジュール”の必要性とインストール方法について書いていきます。
正確には「PHPの拡張機能(拡張モジュール)である”GDライブラリ”」です。
私は作業しながら「GDモジュール」と認識していたので、表記ブレ程度に捉えてください。
環境
- VirtualBox: 6.0.4 r128413 (Qt5.9.5)
- UbuntuServer: 16.04.6 LTS
- PHP:7.0.33-0ubuntu0.16.04.3
WordPressプラグイン
- Regenerate Thumbnails(v3.1.0)
- Force Regenerate Thumbnails(2.0.6…最終更新:3年前)
GDモジュールとは
GDは元来、「GIFを描く (GIF Draw)」を表していた。しかしユニシスが無償ライセンスを取り消した後は非公式に、「グラフィックを描く (Graphics Draw)」を表すこととなった。
GD Graphics Library – Wikipedia
GDは、直線、弧、テキスト(プログラムで指定したフォントを使用する)から成るイメージ、その他のイメージと複数の色を作成できる。
(略)
GDはPHPで広く使われ、PHP 4.3 以降のバージョンではデフォルトの拡張機能となっている。それ以前はオプションであった。
なるほど、GDとはPHPだけのものではなく、その機能もHTML5のcanvasとjavascriptのようなものを持っている。
WordPressでは、描画機能よりもサイズ差分の画像を生成する目的の方が身近なものになると思います。
WordPressでは、主にアップロードされた画像のリサイズやトリミングのために画像処理ライブラリを必要とします。
WordPressで使われている画像処理ライブラリについて調べてみた – bitA Tech Blog
このとき、Imagickが利用できるサーバーの場合はImagick、そうでない場合はGDが使用されるようです。
どちらも入っていない場合は、サムネイルの生成などが行われません。
(略)
WordPress内の処理を覗いてみたところ、_wp_image_editor_choose()という関数によって判定されていることが分かったので、これを使ってみます。
この関数は、GD用とImagick用にそれぞれ用意されている画像処理クラスから、有効な方のクラス名を返してくれるようです。
Imagick(イマジック?)とはなんぞや?って話ですが、こちらもPHPの拡張モジュールです。
“ImageMagick”というライブラリを利用するためのモジュールというわけですね。
(ドローソフトのKritaでImageMagickが呼び出されているのを見たことがある)
ImageMagick とImagickの2つは、名前が似ているけど別物の模様。
ImageMagickとは、C言語で書かれた画像処理ソフトウェア・ライブラリ一式のことです。
[PHP]ImageMagickとImagickの違いについてそろそろ一言いっておくか。 · DQNEO起業日記
Imagickとは、PHPからImageMagickを操作するためのPHP 拡張モジュールです。(こういうのをバイディングといったりします。)
画像の生成にはGDモジュールがカギ
さて、GDについて知ったきっかけは、プラグイン「Regenerate Thumbnails」のエラー文でGoogle検索をしたこと。
Githubのフォーラムで、GDの名前を目にしたときです。
But since today it doesn’t work and shows me a mistake: This tool won’t be able to do anything because your server doesn’t support image editing which means that WordPress can’t create thumbnail images. Please ask your host to install the Imagick or GD PHP extensions.
Regenerate Thumbnails doesn’t work · Issue #68 · Viper007Bond_regenerate-thumbnails · GitHub
But imagick is installed on the server. And i tried to switch to the GD PHP and it also doesn’t work.;(
(略)
I installed Health Check plugin, it shown that Imagick and GD PHP didn’t work really.
やり取り自体は「動作環境に見落としがないかヘルスチェックしてね」→「インストールはしてたけど動いてなかったわー」って感じ。
引用の太字の部分がエラー文(Fig1)。
「サーバが画像の編集をサポートしてないからサムネの生成ができないよ。管理者にImagickかGDモジュールがインストールされているか尋ねてね」って言ってる。
自分が作業していてエラー文を見ていたのに、「ホストに訊けって言われても、自分が管理者だしな……」と後半を読まなかった自分の落ち度。
要するに、こういった画像をリサイズして生成するタイプのプラグインではモジュール(ライブラリ)が必要ってこと。
GDモジュールの有無による作業の結果
仮想サーバ側で新しいテーマのテストをすると同時に、不要なサイズ差分の画像を削除することも目的でした。
高解像度ディスプレイへの対応を見据えると、サムネイルサイズ(150x150px)の画像や、mediumサイズ(300x300px)は不要だと判断したためです。
また、largeサイズで定義していたサイズをmediumサイズに移す予定でした。
まずは不要なサムネイル・mediumサイズの画像を削除し、スッキリしたあとで新しいサイズの画像を生成する……という手順でした。
モジュールの必要性を知った今なら、この作業はうまく行かないことがわかるでしょう。
プラグインは画像の削除はしてくれましたが、サイズ差分の画像を生成してくれませんでした。
(”Force Regenerate Thumbnails”プラグインが正しく動作しなかったのが、3,4日悩む原因でした。
プラグインのメッセージに「成功しました! 〇〇個の画像を△秒でリサイズし、失敗したものはありませんでした。」と表示されましたが、画像は生成されず、エラーではないものだから、どこが原因なのかすぐに分からなかったのです。)
TIPS:実は、「メディア」で定義したサイズ以外に、”medium_large”というサイズが定義されています(WordPress 4.4から追加)。
気づかない間にサイズ差分が生成されているかもしれません。
本当に不要であるなら、サイズの値をゼロにすることで停止できます。
# functions.phpに記述
update_option( 'medium_large_size_w', 0 );
GDモジュールのインストール方法
とりあえず、phpinfo関数を記述したindex.phpを見てみましたが、ここには記載なし。
Image Magickとの性能差は気にするほどではないようなので、デフォルトの拡張モジュールであるGDをインストールすることにしました。
# GDモジュールを検索するコマンド(Fig2)
$ apt-cache search gd | grep php
# >>php7.0-gd - GD module for PHP
# GDのインストール
$ sudo apt install php 7.0-gd
# GDをphpinfoで確認するためにapacheを再起動する(Fig3)
$ sudo /etc/init.d/apache2 restart
コマンド操作は以下のページを参考にしました。
【参考】PHP_UbuntuのPHP環境にGDライブラリのインストールする方法 – Web関連技術調査
apacheを再起動してphpinfoで確認したスクリーンショットがこちら(Fig4)。
スクリーンショットはありませんでしたが、GDをインストールしたことで”Regenerate Thumbnails”プラグインでのサイズ差分の生成に成功しました。
これにより仮想サーバでのテーマのテストと、本番環境で不要な画像を削除するリハーサルができました。
めでたし、めでたし。
なぜGDモジュールがインストールされていなかったか
以前に書いた記事でWordPressが動くようになって、練習の記事を書くだけでした。
だから、画像の生成ができるかどうかなんて気づかなかったのでしょう。
モジュールがインストールされているレンタルサーバとはちがい、仮想サーバを自分で用意したことが原因です。
(この記事の公開に併せて、当時の記事にGDモジュールのインストールについて追記しておきました)
仮想マシンでリハーサル環境を作る人もそんなにいないとはいえ、2年越しに欠陥を埋めることになるとは思わなかった……。
まとめ
- 自分で用意したサーバだったからGDモジュールのインストール漏れに気づけなかった
- GDライブラリは、画像の加工や生成するプラグインのために必要なPHPの拡張モジュールである
- GDモジュールの有無はphpinfo関数で確認できる