モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

NetCommons2で大きなサイズの画像アップロードに失敗する理由

NetCommonsというCMSがあり、そこで画像ファイルアップロードするとある程度のサイズの画像なら問題ないが、大きなサイズの画像だとアップロードに失敗する、という問題が起きました。


メモリやアップロードファイルサイズの設定はすでにphp.iniでされており、phpinfo()で確認してみてもちゃんと設定が通っている状況でした。


しかしデバッガで追ってみると、携帯用のサムネイルを作るためにimagecreatefromjpegというGDの関数を使うところで落ちてしまい、どうやらメモリが足らない状況でした。
どうやら、というのはここで落ちるとエラーを吐かずに死ぬので、メモリ不足のせいで死んだのかどうかをエラーログからは確認できないためです。


ちなみに、imagecreatefromjpegすると、ファイルサイズに関係なく画像のサイズx4byte分のメモリを必要とするらしく、例えば4000x3000pixの画像をアップロードするとそれだけで48Mのメモリが消費されることになります。


で、ぐぐってみると似たようなことで困っている人はいるようなのですが、どうもphp.iniではなく「ini_set」でやると大丈夫、という話がありました。ほんとに??


PHP GD Allowed memory size exhausted - Stack Overflow
http://stackoverflow.com/questions/2827908/php-gd-allowed-memory-size-exhausted


そこで、imagecreatefromjpegを呼ぶ前で「ini_set('memory_limit', '512M')」として試したところ、ちゃんと動くことがわかりました。


そうなると今度はなんでphp.iniで設定した値が使われないんだろう??という疑問がわくわけですが、その理由は実はCMS側の設定でした。


NetCommonsには

「システム管理」→「サーバ設定」→「PHP最大メモリ数」

という項目があり、ここでPHPの最大メモリ数設定が出来るとなっているのですが、どうやらここで設定した値でmemory_limitが設定されてしまうように書かれているようです。

ここに512M等設定すると、大きな画像アップロードでも落ちないようになりました。