hunamizawa’s blog

無い物は作りたい人のメモ帳

Ubuntu での ImagickException: unable to open file `/tmp/magick-***' には extra package を入れろ

環境

症状

php-imagick 経由で SVG 画像を読み込む。

$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 で万事解決しましたとさ。