1. ynwa0826

    Posted

    ynwa0826
Changes in title
+【PHP】Allowed memory size of *** bytes exhaustedエラーの対処法まとめ
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,91 @@
+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はどこにあるのか](https://qiita.com/ritukiii/items/624eb475b85e28613a70)
+
+phpinfoで見るのが早いですね。
+phpが実行可能な場所でこの関数を実行して確認してしまいましょう
+
+そしてphp.iniファイルをいじっていきます。
+
+```
+memory_limit = 256M
+```
+
+最初は128メガになっているかと思うので、ここを変えてあげてください。
+このあと再起動を行わなければいけないので注意!
+apache環境ならapache
+nginxならphp-fpmとなるようです。
+
+
+## メモリが枯渇しないようなコードに
+
+例えばこの記事だと
+
+[Allowed memory size of 134217728 bytes exhausted](https://www.rucaro.org/?p=community_response&tid=145)
+
+for文が途中でループするようなコードになっていたそうです!!
+中の変数に無限に値を入れ続けていると、準備された変数の数分だけメモリは消費されていきます。
+使われなくなった変数を削除してくれるガベージコレクションという仕組みをPHPはもっていますが、無限ループだとそれでも追いつけなくなるでしょう。
+
+[PHP の GC の話](https://www.slideshare.net/y-uti/php-gc)
+
+## スワップの設定
+
+この対処法は今ではなかなかマイナーかもw
+サーバー側にスワップ領域を確保し、開放してやることで、メモリが満杯になっているときにRAM内ではなくハードディスク上にメモリの領域を確保してやるといった方法です。
+
+```sh
+dd if=/dev/zero of=/var/swap bs=1M count=1024
+mkswap /var/swap
+swapon /var/swap
+```
+
+ちなみに逆にswap領域が満杯になっているときはこちら
+
+```sh
+swapoff -a && swapon -a
+```
+
+で、開放してくれます
+
+
+## ini_set関数で一時的にメモリ上限を上げる
+
+こいつを使用するとphp.iniの設定値を一時的に変更してくれます。
+
+```php
+<?php
+ini_set("memory_limit", "512M");
+```
+
+これで特定のファイルにおいては一時的にメモリを引き上げてphpを実行できるようになりました
+
+## unsetを駆使する
+
+確保されたメモリが削除処理されなかった場合、メモリリークといって処理終わってんのにそのプログラムがメモリ食ってる状況になっちゃいます。
+ちなみにphpでは一連の処理が終わると、自動的にメモリを開放してくれます。
+じゃあ、やんなくていいのかというとそういうわけでもないようで。
+非常に長い処理のなかとか、長いforeachの処理のなかとかだとunset関数で変数を初期化してやったほうがいい場合もあるようです。
+
+```php
+unset($data);
+```
+
+これらの中で対処法が見つかればいいなあって感じですね