ニーズが無いだろうけど、書く!
PHPのGDで巨大な画像ファイルを処理すると、負荷がすごい。そこでMacのサーバ限定だけど、sipsコマンドを使うことで低負荷/高速/高画質の画像変換ができるんじゃね?というのが前回のエントリーの内容。
実際に某サーバーの処理を書き換えて試してたところ、うまくいく場合と、いかない場合があることに気づいた。なかなか原因がわからなかったが、やっとわかったので、sipsコマンドをPHPから呼び出す際の注意点について書いてみたい。
sipsコマンドの使い方としては、こんな感じ。
/usr/bin/sips –resampleHeight 100 変換前ファイル –out 変換後ファイル
php内では、ふつうにsystem()でOK.
$srcfile = "/var/home/hoge/fuhihi.jpg";
$dstfile = "/var/home/hoge/fuuu.jpg";
system("/usr/bin/sips --resampleHeight 100 $srcfile --out $dstfile");
このとき、出力側のファイルとなる$dstfileのパスに、シンボリックリンクが含まれていると、sipsが書き出しに失敗する。
なぜか、入力側($srcfile)にシンボリックリンクが含まれていても問題ない様子。
画像変換した後のファイルの出力において、なぜ区別する必要があったのだろうか。単純にバグだろうか。
いや、普通に考えて画像変換程度で、区別する必要はないだろう。
しかし、そうなってる以上、考えてもしょうがないで対策。
$srcfile = realpath("/var/home/hoge/fuhihi.jpg");
$dstfile = realpath("/var/home/hoge/fuuu.jpg");
system("/usr/bin/sips --resampleHeight 100 $srcfile --out $dstfile");
単純に、sipsに渡すパスに対して、realpath()を通してやることで、シンボリックリンクが実体のパスになるので、これで問題なし。
便宜上、PHPで使う場合…という感じで書いたが、system()からはshell経由で呼ばれるはずなので、shell上でも同じ問題が発生します。
ただし、あくまで出力ファイルのパスにシンボリックリンクが含まれているのがまずいだけであって、たとえば、カレントディレクトリにシンボリックリンクが含まれていても、sipsコマンドのパスに含まれてなければOKです(ややこしい。だからなかなか原因がわからなかった)
最近は、OS X Serverを使ったりしてるので、その周りも後ほど書いてみたい。
Popularity: 7% [?]




