スライドショー

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

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

それでは、また。

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

つぶらや

つぶらや

独学PG&SE、東京在住30代女性。
誰でもプログラマーになれるがモットーで、わかりやすい記事を目指しています。