2009年07月01日

PHPでサムネイル作成に失敗する

会社のWebサイトをヘテムル(heteml)というレンタルサーバーで公開している。
このヘテムルは共用サーバーでPHPを使ったWebサービスの試作にも使っている。

専用サーバーと違って共用サーバーはメモリー容量、利用できるプログラムなど制限が課せられていて、Webサービスを動かそうとすると思わぬトラップもある。

先週末から写真(画像)を使ったWebアプリケーションの試作をしている。
hetemlではファイルのアップロードサイズが5MBという制限があるが、php.iniをコントロールパネルで変更できる。
とりあえずこの制限はクリアできた。ただ、最大サイズは50MBなので制限はある。
hetemlでupload_max_filesizeを変更

昨日から運用でこのくらいが上限かなと思う容量10MBでテストしているが、アップロードは問題なさそうだ。
しかし、アップロードした写真(画像)のサムネイル(縮小)画像をレンタルサーバー側で作成する部分で問題がある。
メモリー不足が原因でサムネイル(縮小)画像の作成に失敗するのだ。

よく調べてみると、
ImageCreateFromPNG()やImageCreateFromJPEG()の部分で、
メモリーにロードする時に致命的エラーが発生している。この後に
ImageCopyResampled()
を呼んでサムネイルを生成するのだが、メモリーが少ない環境ではこの手法は使えない。

しかし、いったいどのくらいメモリーは使えるのだろうか。
共用サーバーのメモリを調べてみると50MBだったが、実際に使えるメモリー容量は小さいようだ。
処理できた画像サイズから推定すると16MB程度が最大のようだ。(画像を読み込んだ実験による推定)

ちなみに、必要な容量はファイルサイズではなく、画像をビットマップ展開した時の容量である。
[width] x [height] x [1ピクセルあたりのバイト数](JPEGだと3,透過PNGだと4)である。

1000万画素クラスのカメラ、例えば幅3840ピクセル x 高さ2880ピクセルだと、
3840 * 2880 * 3 = 33177600(31.64MB)
軽く16MBを越えている。

PHPのモジュールを使う限り、このメモリー制限からは逃れられない。策はいくつかあるが、
外部コマンドを使う方法を調べたところ、どうやらImageMagickが使えるようだ。
次回、ImageMagickを使った結果を掲載したい。

【次の記事】
PHPスクリプトからImageMagickを使う


同じカテゴリー(レンタルサーバー)の記事
 レンタルサーバーのディスク容量が増えた (2009-10-15 16:35)
 MySQLの接続タイムアウト設定 (2009-07-09 11:32)
 PHPスクリプトからImageMagickを使う (2009-07-01 21:13)
この記事へのコメント
あくまで個人的にですが、レンタルサーバーで数十MBの画像を処理するプログラムを動かすのは、マナー違反のような気がします。
基本的には、数百KBに押さえて、アップするのが常識では・・。
数十MBを行うんであれば、VPS(上位スペック)か専用サーバーじゃないと、共有している他のユーザーに影響が出ます。

後、プログラムの試作やアップテストなどは、XAMPPなどを利用してローカルでやりましょうよ・・。
Posted by miyata at 2009年09月22日 14:44
miyataさんへ
 そうですね、数十MBの画像というのは共用型のような安価なレンタルサーバではよろしくありませんね。サーバーが安定して動作していてこそのWebサービスなので、控え目に使っていこうと思っています。
Posted by 植物お世話係植物お世話係 at 2009年09月22日 15:26
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。
削除
PHPでサムネイル作成に失敗する
    コメント(2)