プログラムの作成でメモリを意識するのはとても大切です。
ただ、PHPの勉強を始めたばかりではどのように意識したらよいかわからないと思います。
また、メモリのエラーが発生しても解消方法が分からない場合もあるでしょう。
本日はメモリについて以下の内容でお話します。
【解説】メモリについて
【解説】メモリのエラー
【対応策】メモリ上限値の変更
細かく解説しますので是非読んでください。
メモリとは
まず、メモリとは何でしょうか。
パソコンやサーバーに取り付けられている部品という事は皆さんご存知でしょう。
初心者向けの解説本などには、作業机・作業スペースのような表し方をしていたりします。
メモリの容量が大きいほど作業する場所が広がりスムーズにパソコンの処理が進む、というイメージです。
プログラムを実行する際にもメモリを使用して処理が進みます。
メモリについてもっと詳しく知りたい方は、以下のサイトを参考にしてください。
メモリの上限について
プログラムでは、プログラムで使用できるメモリの上限を設定する事が出来ます。
一つのプログラムの実行だけで全てのメモリを使い切るとサーバーで動いている他の処理が進みません。
PHPではphp.iniの中で設定できます。
また、設定上限はプログラム全体ではなく、1リクエストに対しての設定です。
メモリリークについて
メモリリークという問題についてお話します。
プログラムが処理を始めるとメモリは使用域を確保します。
その確保したメモリを処理が終わっても確保したままにすると空きメモリが減っていきます。
この現象をメモリリークと呼びます。
空きメモリがなくなると処理が進まなくなります。
発生原因としては、プログラムの記述が間違っている場合などがあります。
そのため、メモリリークを発生させないためには適切な箇所でメモリ領域を開放するなど対策が必要になります。
エラーが発生したら
メモリのエラーが発生する事は頻繁にあります。
どんなエラーか内容を見ていきましょう。
エラーの内容
よく見るエラーは以下です。
PHP Fatal error: Allowed memory size of xxx bytes exhausted
これはメモリの容量が不足しているという事です。
プログラムの処理に対して、確保されているメモリ容量が小さいのです。
因みに以下のエラーも同じメモリの容量が足りていません。
Fatal error: Out of memory XXXX
基本的にメモリのエラーは容量が足りないというエラーが殆どです。
エラーの原因調査
メモリのエラーが出たからと言って、闇雲にメモリの設定値を増やすのはよくない場合があります。
なぜならば、プログラムの処理が適切でない場合も多いからです。
不必要なループ処理はないでしょうか。
あまりにも沢山のデータを一括で処理しようとしていませんでしょうか。
そんな時にメモリの使用量を確認する方法で原因になっている重い処理を見つけましょう。
サンプルコードで説明します。
<?php echo memory_get_usage(); // 処理前のメモリ使用量の表示 // メモリの使用量を調べたい処理 echo memory_get_usage(); // 処理後のメモリ使用量の表示
上記のようにmemory_get_usageを使用しましょう。
処理前と処理後のメモリ使用量を比べることで、処理のメモリの使用量がわかります。
メモリを使いすぎている処理は、他の記述に修正できないか検討しましょう。
メモリの容量変更
それでは最後にメモリエラー回避のために使用できるメモリサイズを変更する方法を解説します。
php.iniの変更
php.iniの中に、メモリの上限は以下のように記述されています。
memory_limit = 256M
これを倍に設定する場合は以下のように修正します。
memory_limit = 512M
変更しただけでは設定は反映されません。
Apache等のWebサーバーを再起動させてください。
ini_setを使用
特定の関数だけ一時的にメモリ使用量を上げることも出来ます。
以下のようにini_set関数を使用します。
<?php ini_set("memory_limit", "512M"); // 処理
メモリの使用量を上げたい処理や関数の先頭に記述します。
この設定は処理が終了すると破棄されるため、他の処理はphp.iniのmemory_limitがメモリ上限値です。
メモリの解放(unset)は必要?
使い終わったメモリを解放しないとメモリリークが発生する可能性がある事はお話しましたね。
では、メモリの解放は意図的に行った方がよいのでしょうか。
実はメモリは一連の処理を抜けると自動的に開放されます。
あまりにも長い処理のプログラムでない限りは必要ないと言われています。
もし行う場合は以下のようにunsetを記述します。
<?php $unset_val = "samurai"; unset($unset_val);
$unset_valという変数の中身をunsetで破棄しました。
変数を破棄したことで、変数のために確保されていたメモリが解放されます。
まとめ
今回はPHPのメモリについてお話しました。
メモリの容量を考えてプログラムが書けるようになると1つ階段をあがった事になると思います。
是非意識できるように頑張りましょう。
それでは、また。