Allowed memory size of 134217728 bytes exhaustedエラーって時々みます。これはphpに割り当てられたメモリが全部使われちゃったよ〜っていうエラー。これはプログラムだけの問題ではない可能性が高いので、幾つか対策をしなければいけません。その対処法を5つまとめました。
- php.iniの設定
- メモリが枯渇しないようなコードに
- スワップの設定
- ini_set関数で一時的にメモリ上限を上げる
- unsetを駆使する
php.iniの設定を変える
ちなみに冒頭にある134217728 bytesは128MBの意味です。
初期設定ではphpに割り当てられているメモリ容量は128MBとなっています。
これは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はもっていますが、無限ループだとそれでも追いつけなくなるでしょう。
スワップの設定
この対処法は今ではなかなかマイナーかも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);
これらの中で対処法が見つかればいいなあって感じですね