imagickを使うためにImageMagickの最新版をインストールする話

## はじめに

個人的にLAMP環境でImageMagickを使った開発が多いのだが資料が少ない＆古い。
毎回LAMPのセットアップでコケる要因がこのimagickとImageMagickの導入である。
仮想環境も含め数十回は実行したこの導入作業、いい加減アーカイブしておこうと思った次第。
（スナップショット取っとけと言う話はさておいて）
まずImagickとImageMagickの違いから。

## Imagickとは

[phpマニュアル](https://www.php.net/manual/ja/intro.imagick.php)によるとImagickとは
>Imagick は、ImageMagick API を使用して画像の作成や修正を行う ネイティブ PHP 拡張モジュールです。

見ての通りImageMagickが無いとImagickは使用出来ない。
カレーとカレーパンぐらい違う話であり、php開発者なら言わずもがなの話。のはず。
実装時にソースコードには基本的に「ImageMagick」という単語はほぼ出てこない。

```php
$img = new Imagick($filePath);
```

というようにソース上使用するのはImagickである。

## ImageMagickとは

[OSS NEWSより](https://www.ossnews.jp/oss_info/ImageMagick)
>ImageMagick(イメージマジック)とは、画像処理ライブラリです。コマンドラインツールやAPIライブラリとして利用します。非常に多くの画像フォーマットに対応し、高機能な画像処理機能を提供します。

あくまでライブラリであり用途はphpに留まらない。
.NET,C++,Python,Rubyなど導入可能言語は多岐に渡り、
各々MiniMagickやMagick.NETなどの拡張モジュールを導入して使用することになる。
話が戻るがこれらがphpで言うところのImagickである。

## ImageMagickの問題

以前から薄々認識はしていたが、なんせ脆弱性に関する不具合が多い。
「ImageMagick 脆弱性」でググると山のように記事がヒットする。
主にJVNによる指摘をピックアップ。
[ImageMagick における境界外読み取りに関する脆弱性](https://jvndb.jvn.jp/ja/contents/2019/JVNDB-2019-003071.html)
[ImageMagick におけるリソース管理に関する脆弱性](https://jvndb.jvn.jp/ja/contents/2017/JVNDB-2017-007653.html)
[ImageMagick におけるバッファエラーの脆弱性](https://jvndb.jvn.jp/ja/contents/2019/JVNDB-2019-002904.html)

**ていうかもうビルドバージョンレベルで指摘があるやん…**
幅広い機能を持つが故かとにかく多い。
ポンコツコーダーの自分としてはひとまず最新版を入れて対処するしかないというのが悲しいところ…。
少しでもリスクを下げるべくの対処法をそれしか持ってないのは反省点である。

## ImageMagick使わんかったらええやん！

というのが最も早い解決法なのだが、今はイチから学習し直す時間がないので
ひとまず前述のとおり最新版で対応したい。

代替案、ガチめの対策案についてはこちらの記事が詳しいので参考に。
[「さようなら ImageMagick」の考察](https://qiita.com/yoya/items/2076c1f5137d4041e3aa)
[ImageMagickを使うWebアプリのセキュリティ](https://www.mbsd.jp/blog/20180831.html)

## 本題

ということで力不足の自分はImageMagickは最新版を入れて対処しようという方針なので
その方法をご紹介。

**作業環境はこちら**

- MacOS Mojave 10.14.3
- Vagrant
 - CentOS 7.4
 - Apache 2.4.x
 - php 7.2.x


インストールするものとしては大まかに

- ImageMagick
- ImageMagick-libs
- ImageMagick-devel
- php-pear (Imagickインストール用のライブラリ)
- phpize (pecl用ライブラリだが依存パッケージ補完で大体勝手に入る)
- Imagick

### まずImageMagickのダメなインストールから

```shell
yum install ImageMagick
```

**と、やると大事故につながる**

デフォルトリポジトリのImageMagickは6.x系なのでコレの流れで進めていくと
依存関係モジュールもそれに合ったものが入ってしまい、気づいた時にはどれがどの依存パッケージなのか分からなくなりもう色々アレになってしまう。
最近気付くのが遅れこれをやらかしてしまい、AWSのインスタンスを1個潰すハメになってしまった。

### ImageMagickは公式のrpmを使用する

最新版が配布されているのでここを使う。
[ImageMagick公式](https://www.imagemagick.org/script/download.php)
現時点では7.1.1-46

### 最初にLibsから

```shell
yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-libs-7.1.1-46.x86_64.rpm
```

**※2019/10/07追記**

まっさらなサーバだと色々依存ライブラリが足りないとエラーが出て進まないことが多々ありましたんで
とりあえず判明してるやつの解決策を追記しておきます。
[各ライブラリの最新Verはpkgs.orgから探したらよいのかな](https://pkgs.org/)

#### **コケポイント①** openjpeg無いよエラー

```
エラー: パッケージ: ImageMagick-libs-7.0.8-68.x86_64 (/ImageMagick-libs-7.0.8-68.x86_64)
             要求: libopenjp2.so.7()(64bit)
```

openjpegって一見分からねえですがパッケージ取ってきてダイレクトに入れます。
書いてて気付いたけどそのままyum installで良かった。。。

```
wget http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/o/openjpeg2-2.3.1-1.el7.x86_64.rpm
rpm -Uvh openjpeg2-2.3.1-1.el7.x86_64.rpm
```

後述のdevelを入れる際にopenjpeg-devel入れろとも言われるので合わせて対応。
openjpeg-devel入れるのにopenjpeg-toolsも入れろと言われるので（ｒｙ

### 次に本体

```shell
yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-7.0.8-68.x86_64.rpm
```

### develも入れておきたいが公式には載っていない...<br>けど一応存在するようである

```shell
yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-devel-7.0.8-68.x86_64.rpm
```

これでOK

```shell
magick --version
Version: ImageMagick 7.0.8-68 Q16 x86_64 2019-05-12 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(3.1) 
Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib jng jp2 jpeg lcms ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib
```

## Imagickのインストール

### peclコマンドを使えるようにする

```shell
yum install php-pear
pecl version
PEAR Version: 1.10.9
PHP Version: 7.2.18
Zend Engine Version: 3.2.0
```

imagickをインストール

```shell
pecl install imagick
```

#### コケポイント②phpize無いよエラー

peclコマンド叩いたら稀に出ます

```
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.
ERROR: `phpize' failed
```

php-develを入れて解決

```
yum install php-devel
```

### 確認

```shell
pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
imagick 3.4.4   stable
```

php.iniにextensionを追加する

```shell:php.ini
[PECL]
extension=imagick.so
```

Apache再起動してphpモジュール確認

```shell
service httpd graceful
php -m | grep imagick
imagick
```

ついでにphpinfo();なりでimagickが追加されてることを確認する。

## それでもimagickが動かない

**追記 2020-06**

ちゃんとの上の手順でやったのにphpinfoにimagickが出ないって場合があると思いますが
phpをcgi形式で稼働させてないでしょうか
apacheの再読み込みだけでなくphp-fpmも再起動してあげてください

```sh
$ service php-fpm restart
```
これで出ると思います。

**おわり。**