PHPのメモリの上限やエラーについて学ぼう!メモリの考え方基本解説

プログラムの作成でメモリを意識するのはとても大切です。

ただ、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つ階段をあがった事になると思います。

是非意識できるように頑張りましょう。

それでは、また。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次