PHP + GD で大きな画像を処理する際のメモリ不足対策

どうも。
ウェブサイトのイラストライブラリを作り続けています。
ここではPHPを利用して大きな画像を加工してサムネイルを自動生成するプログラムを作っているのですが、
大きなサイズだとメモリが足りずエラーが吐き出されてしまうわけです。
(ここでは imagecreatefromjpeg() で発生しています)

設定ファイルのmemory_limitを手作業で増やしてもいいのですが、
折角なのでプログラム内で調整できるようにしたいな~と思って、リファレンスのこの記事を見つけました。

http://php.net/manual/ja/function.imagecreatefromjpeg.php#64155



内容としては getimagesize() で画像の情報を取得して必要メモリを計算後、
設定ファイルで指定しているメモリ容量より大きければ再設定してやる、といった内容かと思います。
 ($memoryLimitMBが定義されてなかったり、カッコ抜けてたりしてそのままでは使えないのですが・・・・

例えば、現在設定しているメモリが128MBだとして次のファイルを読み込ませたいとします。
[6248 x 4440pixel, 8bits, 3channels]

この情報を元に上記計算方法で必要メモリを得ます。

(6248 * 4440 * 8 * 3 / 8 + 65536) * 1.5 = 124933344 = 119.14572144 MB

これに、memory_get_usage()・・・現在利用中のメモリ使用量を足すわけなのですが、
128MB以下になり、memory_limitは更新されません。

でも、メモリ足りないっていうエラーが出るんですね。ハハ。

そもそもこの計算方法、良く分からないまま利用している感じです。
64Kb足してるのは?1.5掛けてる意味は?ううん、分からない・・・・。

あれこれ調べてみて、この1.5倍を増やしてみました。
はい、動きました。煮え切らないですね・・・・。
※ 1.7以上を設定してやると大きいサイズでも動くっぽいです。
一応ソースを載せておきます。良く分からないままコピペして動いてるので保障は出来ませんが。

 

コメント