Home > レンタルサーバー | 備忘録 > PHPでサムネイル作成に失敗する

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を使う