Help us understand the problem. What is going on with this article?

【PHP】Allowed memory size of *** bytes exhaustedエラーの対処法まとめ

Allowed memory size of 134217728 bytes exhaustedエラーって時々みます。これはphpに割り当てられたメモリが全部使われちゃったよ〜っていうエラー。これはプログラムだけの問題ではない可能性が高いので、幾つか対策をしなければいけません。その対処法を5つまとめました。

  1. php.iniの設定
  2. メモリが枯渇しないようなコードに
  3. スワップの設定
  4. ini_set関数で一時的にメモリ上限を上げる
  5. unsetを駆使する

php.iniの設定を変える

ちなみに冒頭にある134217728 bytesは128MBの意味です。
初期設定ではphpに割り当てられているメモリ容量は128MBとなっています。
これはphp.iniというファイルで設定されており、変更可能です。
ただ、もちろんですがサーバーのスペックを超えた設定を行うことはできません!これ超えて設定したらどうなるんだろう。。

ちなみにphp.iniの場所、自分でもよく忘れるので探し方を解説してくれているページを貼っておきます。

もういい加減覚えよう。php.iniはどこにあるのか

phpinfoで見るのが早いですね。
phpが実行可能な場所でこの関数を実行して確認してしまいましょう

そしてphp.iniファイルをいじっていきます。

memory_limit = 256M

最初は128メガになっているかと思うので、ここを変えてあげてください。
このあと再起動を行わなければいけないので注意!
apache環境ならapache
nginxならphp-fpmとなるようです。

メモリが枯渇しないようなコードに

例えばこの記事だと

Allowed memory size of 134217728 bytes exhausted

for文が途中でループするようなコードになっていたそうです!!
中の変数に無限に値を入れ続けていると、準備された変数の数分だけメモリは消費されていきます。
使われなくなった変数を削除してくれるガベージコレクションという仕組みをPHPはもっていますが、無限ループだとそれでも追いつけなくなるでしょう。

PHP の GC の話

スワップの設定

この対処法は今ではなかなかマイナーかもw
サーバー側にスワップ領域を確保し、開放してやることで、メモリが満杯になっているときにRAM内ではなくハードディスク上にメモリの領域を確保してやるといった方法です。

dd if=/dev/zero of=/var/swap bs=1M count=1024
mkswap /var/swap
swapon /var/swap

ちなみに逆にswap領域が満杯になっているときはこちら

swapoff -a && swapon -a

で、開放してくれます

ini_set関数で一時的にメモリ上限を上げる

こいつを使用するとphp.iniの設定値を一時的に変更してくれます。

<?php
ini_set("memory_limit", "512M");

これで特定のファイルにおいては一時的にメモリを引き上げてphpを実行できるようになりました

unsetを駆使する

確保されたメモリが削除処理されなかった場合、メモリリークといって処理終わってんのにそのプログラムがメモリ食ってる状況になっちゃいます。
ちなみにphpでは一連の処理が終わると、自動的にメモリを開放してくれます。
じゃあ、やんなくていいのかというとそういうわけでもないようで。
非常に長い処理のなかとか、長いforeachの処理のなかとかだとunset関数で変数を初期化してやったほうがいい場合もあるようです。

unset($data);

これらの中で対処法が見つかればいいなあって感じですね

ynwa0826
フリーランスです。 Web系ベンチャーに務めてました。インターン1年を経験後に正社員を2年。 PHPかRailsメインです。インフラとフロントも少々。 もともと数年前から自ブログに書いていた記事を移行したため、一部古い記事があります。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away