[PHP]画像が加工(リサイズ・トリミング)されないとき(class.image.php、Zebra_Image.php)

以前のブログで取り扱った「class.image.php」及び「Zebra_Image.php」を使って、サイズ変換付きアップローダを作っていた時に起こった現象とその対応です。

ローカル環境では動作していたのですが、本番環境にアップロードして動作させると画面が真っ白になってしまいました。
確認した状況を整理すると次のような感じです。

1.アップロード用のphpへPOSTしたら結果画面がリダイレクトされない(真っ白)
2.画像はアップロードされている
3.リサイズはされていない
4.トリミングされてない
5.容量の小さな画像(数10KB程度)はアップロード加工が正常に行われる。
6.デジカメレベルの画像(3MB程度)はアップロードだけされて、加工がされない。

要は元の画像が、リサイズ等の加工がされず、そのままアップロードされていました。

以下、対応手順です。

まず、「1.」について対応します。

本番サーバとして使っている環境は、基本的にPHPからブラウザへのエラー表示をしない設定になっています。
とは言え、本番環境のphp.iniファイルをいじるのは再起動も伴うので普通はしません。
そこで、実行時にini_set()を利用して、PHPのエラー出力を有効にします。
とりあえず、エラーを出力したいファイルの最上部に記述すれば良いでしょう。

<?php
ini_set( 'display_errors', 1 ); //PHPエラー表示 1:する 2:しない

すると下記のエラーを確認しました。

「Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 13056 bytes) in <ソースへのパス> on line <行数>」

どうやらメモリオーバーのようです。

表示されている行数付近を見てみると、どうやら

imageCreateFromJpeg

でエラーになっていたようです。

メッセージ上の数値を読むと

33554432 byte = 32 * 1024 * 1024 byte

となるので、上限32MBの枠を超えてしまったことになります。

メモリの確認方法としては他に、ini_getを使う手段があります。

echo ini_get('memory_limit');

先ほどと値が同じ「32M」と表示されました。

とりあえず、2倍して64MBにしてみようと思います。

.htaccessファイルを作成し、下記の記述をします。

php_value memory_limit 64M

これを、アップロードするソースと同じ場所に設置すると、今回のエラーが解消されました。

※ご注意
掲載している内容についてはご自身の責任で参考にされてください。