Ubuntu での ImagickException: unable to open file `/tmp/magick-***' には extra package を入れろ
環境
- 開発:Windows 10 + PHP 7.4.5 (cli) + ImageMagick 6.9.7
- 運用:Ubuntu 18.04 + Apache 2.4 + PHP 7.4.6 + ImageMagick 7.0.10
症状
$img = new Imagick('hoge.svg');
すると、次の例外がスローされる。
PHP Fatal error: Uncaught ImagickException: unable to open file `/tmp/magick-25662B639-gQXNdPk': No such file or directory @ error/constitute.c/ReadImage/544
原因と対処
Ubuntu で提供されている libmagickcore-6.q16-3
には、SVG のサポートが含まれていない。そのため SVG を読むと当然コケるのだが、なんの関連もない unable to open file
なる例外が投げつけられるので、原因の把握には相当な時間を要することになる。
すなわち、libmagickcore-6.q16-3-extra
を手動でインストールすれば問題は解消する。なお、php-imagick
の依存関係で自動的にインストールされるのは無印 package だけであり、extra package は手動でインストールする必要がある。
apt-get install libmagickcore-6.q16-3-extra
事の顛末
私は PHP 初心者。ImageMagick と組み合わせたアプリを作り、サーバーで走らせたところ、このような例外に遭遇した。
ただ画像を読み込むだけなので、例外の原因の検討がつかない。ひとまず @ error/constitute.c
と見えるので、imagick 側の問題か?と考える。
最初に疑ったのは、/tmp/
絡みの例外なので PrivateTmp の影響。そこで PrivateTmp = false
してみても、$img->setRegistry('tmp-directory', '/hogemoge')
してみても、何も変わらない。
unable to open file tmp magick とかで検索してみると、「ImageMagick の特定バージョンでそういうバグがある」的な Issue を見たので、もしかしてバグを踏み抜いてる?
なら最新の ImageMagick を入れるか、と思って PECL の準備を始めた。ビルドの依存関係になるので何気なく aptitude show libmagickcore-6.q16-3-extra
を見てみると
This package adds support for SVG, WMF, OpenEXR, DjVu and Graphviz to MagickCore.
あっ……
apt-get install libmagickcore-6.q16-3-extra
で万事解決しましたとさ。