mattintosh note

どこかのエンジニアモドキの備忘録

Amazon Linux 2 の Extra Library PHP 7.4 に imagick をインストールする

amazon-linux-extras でインストールした PHP 7.4 で WordPress 用に imagick をインストールしようとしたら無かったのでいまのところパッケージマネージャからはインストールできないっぽい。

bash-4.2# amazon-linux-extras install -y php7.4
bash-4.2# yum search imagick
Loaded plugins: ovl, priorities
Warning: No matches found for: imagick
No matches found

ここで「epel にはあるだろ…」とか思ってやると

bash-4.2# amazon-linux-extras install -y epel
bash-4.2# yum info php-pecl-imagick
Loaded plugins: ovl, priorities
Name        : php-pecl-imagick
Arch        : x86_64
Version     : 3.4.4
Release     : 1.el7
Size        : 122 k
Repo        : epel/x86_64
Summary     : Provides a wrapper to the ImageMagick library
URL         : http://pecl.php.net/package/imagick
License     : PHP
Description : imagick is a native php extension to create and modify images using the
            : ImageMagick API.
            : This extension requires ImageMagick version 6.2.4+ and PHP 5.1.3+.
            :
            : IMPORTANT: Version 2.x API is not compatible with earlier versions.
bash-4.2# yum install -y php-pecl-imagick
:
中略
:
Error: Package: php-pecl-imagick-3.4.4-1.el7.x86_64 (epel)
           Requires: php(api) = 20100412-64
           Installed: php-common-7.4.19-1.amzn2.x86_64 (@amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-5.4.16-43.amzn2.x86_64 (amzn2-core)
               php(api) = 20100412-64
           Available: php-common-5.4.16-43.amzn2.0.1.x86_64 (amzn2-core)
               php(api) = 20100412-64
           Available: php-common-5.4.16-43.amzn2.0.2.x86_64 (amzn2-core)
               php(api) = 20100412-64
           Available: php-common-5.4.16-43.amzn2.0.3.x86_64 (amzn2-core)
               php(api) = 20100412-64
           Available: php-common-5.4.16-43.amzn2.0.4.x86_64 (amzn2-core)
               php(api) = 20100412-64
           Available: php-common-5.4.16-45.amzn2.0.5.x86_64 (amzn2-core)
               php(api) = 20100412-64
           Available: php-common-5.4.16-45.amzn2.0.6.x86_64 (amzn2-core)
               php(api) = 20100412-64
           Available: php-common-5.4.16-46.amzn2.0.2.x86_64 (amzn2-core)
               php(api) = 20100412-64
           Available: php-common-7.4.1-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-7.4.3-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-7.4.4-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-7.4.5-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-7.4.7-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-7.4.9-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-7.4.11-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-7.4.14-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
           Available: php-common-7.4.15-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(api) = 20190902-64
Error: Package: php-pecl-imagick-3.4.4-1.el7.x86_64 (epel)
           Requires: php(zend-abi) = 20100525-64
           Installed: php-common-7.4.19-1.amzn2.x86_64 (@amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-5.4.16-43.amzn2.x86_64 (amzn2-core)
               php(zend-abi) = 20100525-64
           Available: php-common-5.4.16-43.amzn2.0.1.x86_64 (amzn2-core)
               php(zend-abi) = 20100525-64
           Available: php-common-5.4.16-43.amzn2.0.2.x86_64 (amzn2-core)
               php(zend-abi) = 20100525-64
           Available: php-common-5.4.16-43.amzn2.0.3.x86_64 (amzn2-core)
               php(zend-abi) = 20100525-64
           Available: php-common-5.4.16-43.amzn2.0.4.x86_64 (amzn2-core)
               php(zend-abi) = 20100525-64
           Available: php-common-5.4.16-45.amzn2.0.5.x86_64 (amzn2-core)
               php(zend-abi) = 20100525-64
           Available: php-common-5.4.16-45.amzn2.0.6.x86_64 (amzn2-core)
               php(zend-abi) = 20100525-64
           Available: php-common-5.4.16-46.amzn2.0.2.x86_64 (amzn2-core)
               php(zend-abi) = 20100525-64
           Available: php-common-7.4.1-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-7.4.3-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-7.4.4-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-7.4.5-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-7.4.7-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-7.4.9-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-7.4.11-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-7.4.14-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
           Available: php-common-7.4.15-1.amzn2.x86_64 (amzn2extra-php7.4)
               php(zend-abi) = 20190902-64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

という感じで Amazon LinuxPHP 7.4 と衝突する。amzn2extra-php7.3/2/x86_64 には php-pecl-imagick パッケージが存在するので 7.4 にもそのうち追加されるんだろうけど取り急ぎ必要なので手動でインストールしなければならない。

ImageMagickソースコードを引っ張ってきてもできるけど面倒なので pecl にやってもらう。

imagick のコンパイルに必要なパッケージを用意する。AWS 上の Amzon Linux 2 にはインストールされているものもあるかもしれないけど Docker の amazonlinux:2 には make なんかが無いので入れておく必要がある。

bash-4.2# yum install -y php-pear php-devel gcc make ImageMagick-devel

pecl で imagick をインストール。

bash-4.2# yes '' | pecl install -f imagick
:
中略
:
Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0" install
Installing shared extensions:     /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/lib64/php/modules/
Installing header files:          /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/include/php/
running: find "/var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0" | xargs ls -dils
1198656    4 drwxr-xr-x 3 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0
1198675    4 drwxr-xr-x 4 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr
1198679    4 drwxr-xr-x 3 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/include
1198680    4 drwxr-xr-x 3 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/include/php
1198681    4 drwxr-xr-x 3 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/include/php/ext
1198682    4 drwxr-xr-x 2 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/include/php/ext/imagick
1198683    4 -rw-r--r-- 1 root root    1828 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/include/php/ext/imagick/php_imagick_shared.h
1198676    4 drwxr-xr-x 3 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/lib64
1198677    4 drwxr-xr-x 3 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/lib64/php
1198678    4 drwxr-xr-x 2 root root    4096 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/lib64/php/modules
1198674 1248 -rwxr-xr-x 1 root root 1275632 Jul  9 15:09 /var/tmp/pear-build-defaultuseraWrMzq/install-imagick-3.5.0/usr/lib64/php/modules/imagick.so

Build process completed successfully
Installing '/usr/lib64/php/modules/imagick.so'
Installing '/usr/include/php/ext/imagick/php_imagick_shared.h'
install ok: channel://pecl.php.net/imagick-3.5.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini

メッセージの通り /usr/lib64/php/modules/imagick.so が配置されるのであとは PHP で有効にさせるためにファイルを配置する。

pecl の指示では、

You should add "extension=imagick.so" to php.ini

となっているけど私は php.ini を触らず php.d でオーバーライドする派なので /etc/php.d/ にファイルを配置する。ファイル名は拡張子が ini であればなんでもいいけどここでは /etc/php.d/user-imagick.ini とする。(ちなみに PHP 7.3 では /etc/php.d/40-imagick.ini が配置される)

bash-4.2# echo "extension=imagick.so" >/etc/php.d/user-imagick.so

sudo でやる人は

bash-4.2$ echo "extension=imagick.so" | sudo tee /etc/php.d/user-imagick.ini

とか

bash-4.2$ sudo sh -c 'echo "extension=imagick.so" >/etc/php.d/user-imagick.ini'

のようにやればいいよ。(sudo 定期)

php -mphp -i でチェックして imagick が出力されれば OK。

bash-4.2# php -m | grep imagick
imagick

削除する場合は pecl でアンインストールして INI ファイルを削除。

bash-4.2# pecl uninstall imagick
bash-4.2# rm /etc/php.d/user-imagick.ini

gd でなんとかならないんですかね。