【PHP】Fatal Error : Allowed memory size of ○○ bytes exhausted と表示が出た時の対処法

2017年10月26日

PHPでサービスを作っていると、時たまメモリが足りなくて

 

Fatal Error
Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 47284224 bytes)    
File: /Applications/MAMP/htdocs/www/app/View/Layouts/index.ctp    
Line: 210

Notice: If you want to customize this error message, create app/View/Errors/fatal_error.ctp

 

こんな感じのエラーが出る事がある。
これはPHPが利用できるメモリ制限を超えてしまった時に起こるエラーで、php.iniのmemory_limitで設定できる。

 

php メモリ設定

php.ini

; Maximum input variable nesting level
; http://www.php.net/manual/en/info.configuration.php#ini.max-input-nesting-level
;max_input_nesting_level = 64

; Maximum amount of memory a script may consume (128MB)
; http://www.php.net/manual/en/ini.core.php#ini.memory-limit
memory_limit = 128M

php.ini内で、/memory_limit と打つと該当箇所まで行けるので、その設定値を変更。

値は色々設定できて、
memory_limit = 512M
memory_limit = 256M
memory_limit = 128M

と上げれば上げるほど、phpの使用可能メモリが増える。

 

設定したら、Apacheを
service httpd restart
で再起動する。

また無制限にメモリを使用したい場合は、
memory_limit = -1

と書けば、無限に利用できる。

 

メモリを低くする理由

ここで、思ったのは、メモリを無制限に設定できるのであれば、全てのwebアプリで無制限にすれば良いのではないか?ということ。

しかしそれには理由があって、スクリプトの記述ミスで、無駄にメモリを消費すると、同時に繋いでいる他のユーザーに影響する可能性があるため、標準の設定ではメモリの設定を低くし、プログラムのミスを発見しやすくしておくのが良いらしい。

 

本番環境では「無制限」に設定する事も結構あるらしいし、僕も本番環境では無制限に設定する事がほとんど。

それに、何か不具合が起きないよう、ある一定のメモリ数を超えた時に、ログを残す様に設定をしたりすると良いらしいです。

[参考]
http://blog.thingslabo.com/archives/000183.html