PHPエラー「Allowed memory size of 536870912 bytes exhausted」の原因と解決方法
PHPプログラムを実行した際に、以下のようなPHPエラーが出ることがある。
PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 64 bytes) in 〜〜〜
エラーメッセージを読むと、「割り当てられたメモリ容量『約512MB』を使い果たした」といった内容になっているので、実行したPHPプログラムの実行完了までに必要となるメモリ容量が、PHPアプリケーションに割り当てられたメモリ容量の最大値よりも大きいのであろう、ということが分かる。
解決方法1 PHPが使用できるメモリの上限値を現在値よりも大きな値に変更する。
したがって、PHPが使用できるメモリ容量を増やしてやれば(PHPが使用できるメモリの上限値を現在よりも大きな値に設定すれば)、このエラーは解決できる。
※PHPが使用できるメモリの上限値は、PHPアプリケーションの環境設定ファイル「php.ini」のmemory_limitを修正することで変更できる。
《修正例》
memory_limit = 512M ; Maximum amount of memory a script may consume
《修正後》
memory_limit = 1024M ; Maximum amount of memory a script may consume
さて、本当にこの解決方法で良いのか、という疑問もあるかもしれない。
本当の解決方法は、PHPのメモリの割り当てを増やすのではなく、プログラムを見直し、メモリ消費量を抑えるように努めるべき、という考えもあるかもしれない。
解決方法2 PHPプログラムを見直し、メモリ消費量を抑える
例えば、DB(データベース)の検索結果を配列に格納するような場合、本当に必要な値のみを配列に格納しているのかどうかで、配列を保持するために必要なメモリ容量の大きさに差が出る。
select * from テーブル名;
というSQL文の結果を配列に格納する場合、「*(アスタリスク)」ではselect(選択)するカラムが、テーブル内の「全て」になるから、もしテーブル内にカラムが100個もある場合、カラム100個分もの値を検索した結果を保持することになる。
select カラム名A from テーブル名;
というSQL文の結果を配列に格納する場合、select(選択)するカラムが、テーブル内の「カラム名A」のみになるから、もしテーブル内にカラムが100個もある場合でも、カラム名Aのカラム1個分の値のみを検索した結果を保持することになる。
仮にテーブルの各カラムそれぞれの値の大きさがすべて同じだとすると、前者と後者のSQL文の実行結果を配列に格納した場合、前者は後者よりも100倍も大きなメモリ容量を消費してしまう。
この例では、前者のSQL文を後者のSQL文に書き換えるだけで、メモリの消費量を100分の1にまで低減できる。
自分で書いたPHPプログラムであれば、心身ともに余裕がない切羽詰まった状況でない限り、このような見直しはした方がよい、と思う。