ImageMagick

ImageMagick の脆弱性 (CVE-2016-3714) に関する注意喚起 (2016/05/09)

インストール

Windows環境へのインストール

ImageMagick本体と、それをPHPから利用するためのPECLの拡張モジュールが必要です。

方法1

PECLの拡張モジュール

PECLのモジュールは、windows.php.net - /downloads/pecl/releases/imagick/からダウンロードできます。そこでのファイル名は「php_imagick-*.*.*-PHP_VERSION-THREAD_SAFE-vc**-xPLATFORM.zip」の形式となっており、

  • PHP_VERSION … 5.3や5.4といったPHPのバージョン
  • THREAD_SAFE … ts (スレッドセーフ) か、nts (非スレッドセーフ)
  • xPLATFORM … x86かx64

の3点に注意して、環境にあったものを選択します。ファイルをダウンロードしたならば、そこに含まれる[php_imagick.dll]を、php.iniのextension_dirで設定されているディレクトリにコピーします。そしてphp.iniに、extension=php_imagick.dllを追記します。

ImageMagick本体

ImageMagick本体は、次のページにあるインストーラを利用するのが簡単です。これを利用すると必要なファイルがProgram Files以下にコピーされ、そこへのPATHが設定されます。

Windows Binary Release - ImageMagick: Install from Binary Distribution

またはwindows.php.net - /downloads/pecl/deps/にあるImageMagick-*.zipをダウンロードし、これのbinフォルダからCORE_RL_*.dllとIM_MOD_RL_*.dllの名前のファイルを、パスが通っている場所へコピーします。これらのファイルのうち、たとえばGIFに必要なのはIM_MOD_RL_gif_.dllです。

方法2

  1. New builds for PHP 5.4 and PHP 5.3 « Mikko’s blogのページにあるimagick-php54-php53.tgzをダウンロードして展開します。
  2. 展開されたフォルダにあるDLLを、php.iniのextension_dirで設定されているディレクトリにコピーします。どのDLLを使用するかは、PHPのバージョンとスレッドセーフであるかどうかにより決定されます。たとえばPHP 5.4の環境でphpinfo()の呼び出しでThread Safetyがenabledとなっているならば、php54\php_imagick_ts.dllになります。PHPのバージョンなどはphpinfoで確認できます。
  3. php.iniにDLLの情報を追記します。DLLのファイル名に合わせて、たとえば
    [Imagick]
    extension=php_imagick_ts.dll
    
    とします。
  4. 先ほど展開したファイルに含まれるImageMagick-x.x.x-vc9フォルダを、任意の場所へコピーします。そして環境変数PATHに、そのパスを追加します。
  5. サーバを再起動します。
  6. phpinfoに「imagick」の項目が追加されていれば、インストールは成功です。
Imagick Windows Builds « Mikko’s blog

ホスティング環境へのインストール

たとえばさくらインターネットならば、php.iniに

extension = imagick.so

を追記するだけです。基本仕様|さくらインターネット公式サポートサイト

現在では不要となっています。これを指定すると「PHP Warning: Module "imagick" is already loaded in Unknown on line 0」と警告されます。

トラブル対処法

ファイルが見つからない

ファイルへのアクセス時に、Fatal error: Uncaught exception 'ImagickException' with message 'UnableToOpenBlob `**.jpg': No such file or directory'のようにエラーとなることがあります。そのときには、ファイルを絶対パスで指定するようにします。

なお現在の絶対パスは、realpath()で取得できます。PHP: realpath - Manual

ファイルハンドルから読み込めない

readImageFile()での読み込み時に、Fatal error: Uncaught exception 'ImagickException' with message 'Unable to read image from the filehandle'とエラーとなることがあります。そのときには先に文字列に読み込んでから、その文字列をreadImageBlob()に渡すようにします。PHP :: Bug #58948 :: Unable to read image from the filehandle

$data = file_get_contents( $filename );

$image = new Imagick();
$image->readImageBlob( $data );

特定のファイル形式だけ読み込めない

画像からの読み込み時に「Fatal error: Uncaught exception 'ImagickException' with message 'NoDecodeDelegateForThisImageFormat `FORMAT'」とエラーとなるときには、FORMATの形式に対応したライブラリが用意されていません。そのときにはwindows.php.net - /downloads/pecl/deps/からImageMagickをダウンロードし、対応するライブラリをbinフォルダのIM_MOD_RL_*.dllからコピーします。

PHPのマニュアルから検索