PHP

【PHP】エラー「 Allowed memory size of *** bytes exhausted (tried to allocate ** bytes)」時の対処法

エラーの事象

PHPのシステムで以下のようなエラーが発生しました。

Fatal error : Allowed memory size of 2147483648 bytes exhausted (tried to allocate 80 bytes) in ・・・

なんと、処理に必要なメモリサイズがPHPで許容しているサイズ(2GB)を超えてしまったため、発生しました。

ファイルのアップロード処理やダウンロード処理の場合は大量のデータを扱うため比較的発生しやすかったりします。

このエラーの対処するにはメモリの最大サイズを上げる必要がありますが、今回はソフトウェア面での対処法をご紹介します。サーバに乗っているメモリサイズを超える場合は、対象の処理を見直すか物理的なメモリサイズを変更する必要が出てきます。

システム全体のメモリ上限を変更する

システム全体の最大メモリを上げるにはPHPの設定ファイルを修正します。

設定ファイルの場所はデフォルトでは「/etc/php.ini」になっています。サーバの構成によって異なる部分なので、そこは各々確認してみてください。

php.iniを変更

; Maximum amount of mem
; http://php.net/memory
;memory_limit = 2048M
memory_limit = 3072M

memory_limit」の設定を2GBから3GBに変更しています。

注意点としては、設定を反映させるにはApache(Webサーバ)の再起動が必要になります。

念のためApacheの再起動のコマンドを載せておきます。

・CentOS6の場合

$ /etc/init.d/httpd restart

・CentOS7の場合

$ systemctl restart httpd

処理単位でメモリ上限を変更する

処理ごとに最大メモリサイズを変更する場合は、PHPのソース内に以下のコードを追加すれば可能になります。

ini_set("memory_limit", "3072M");

これにより、このコード以下の処理はセッションが終了するまでの間、最大メモリサイズ3GB設定になります。

php.iniの設定よりもini_set()の設定が優先されるためです。

 

補足として、あまり推奨されていませんがメモリ上限をなくすことも可能です。

ini_set("memory_limit", "-1");

設定値を「-1」にすることで無制限に使用できますが、物理メモリサイズを超えるとエラーになるのでご注意ください。

-PHP