PHPで実行した処理のメモリ消費を確認するときの方法をメモしておきます。
実プログラム中に差し込こまないといけませんが、開発中などに作りながらメモリ使用量を確認しつつ作業できるので、普段から自分でもよく使っています。
この記事の内容
- PHPでのメモリ使用量の確認方法をご紹介
- 確認方法は2種類
- 「memory_get_usage」は現在のメモリ使用量を出力
- 「memory_get_peak_usage」は最大メモリ使用量を出力
メモリの使用量を確認する
ポイントは「memory_get_usage」と「memory_get_peak_usage」の2。
「memory_get_usage」は呼び出したタイミングのメモリ使用量を返すのに対し、「memory_get_peak_usage」は一連の処理の中での最大のメモリ使用量を返します。
サンプルソースを見てみましょう。
memory_check.php
<?php
print "実行開始[メモリ使用量]:". memory_get_usage() / (1024 * 1024) ."MB\n";
print "実行開始[メモリ最大使用量]:". memory_get_peak_usage() / (1024 * 1024) ."MB\n";
print "-----------------------------------------------\n";
// [処理1]
$data1 = [];
for($i=0; $i < 10000; $i++) {
$data1[] = $i;
}
print "処理1実行後[メモリ使用量]:". memory_get_usage() / (1024 * 1024) ."MB\n";
print "処理1実行後[メモリ最大使用量]:". memory_get_peak_usage() / (1024 * 1024) ."MB\n";
print "-----------------------------------------------\n";
// [処理2]
$data3 = [];
for ($j = 0; $j < 10; $j++) {
// 10,000の要素を持つ配列を生成
$data2 = range(1, 10000);
$data3[] = $data2+$data3;
}
print "処理2実行後[メモリ使用量]:". memory_get_usage() / (1024 * 1024) ."MB\n";
print "処理2実行後[メモリ最大使用量]:". memory_get_peak_usage() / (1024 * 1024) ."MB\n";
print "-----------------------------------------------\n";
// メモリ解放
$data2 = [];
$data3 = [];
print "実行終了[メモリ使用量]:". memory_get_usage() / (1024 * 1024) ."MB\n";
print "実行終了[メモリ最大使用量]:". memory_get_peak_usage() / (1024 * 1024) ."MB\n";
print "-----------------------------------------------\n";
?>
結果
実行開始[メモリ使用量]:0.22373199462891MB
実行開始[メモリ最大使用量]:0.23625183105469MB
-----------------------------------------------
処理1実行後[メモリ使用量]:1.6462326049805MB
処理1実行後[メモリ最大使用量]:1.6479873657227MB
-----------------------------------------------
処理2実行後[メモリ使用量]:16.833686828613MB
処理2実行後[メモリ最大使用量]:16.836761474609MB
-----------------------------------------------
実行終了[メモリ使用量]:1.6467895507812MB
実行終了[メモリ最大使用量]:16.836845397949MB
実行開始時点ではメモリ使用量/最大メモリ使用量共に「0.22MB」と少ないことが分かります。
処理1では、配列に値を1万個代入するという比較的軽い処理をしており、メモリ使用量として「1.65MB」が使用されています。
次に処理2では、10個の配列の中にさらに要素が1万個ある2次元配列を作成しており、メモリ消費も激しいため、使用量が「16.83MB」になっています。
最後に、メモリの解放をするため処理2で作成した配列を空にしています。そうすることで解放直後のメモリ使用量は「1.65MB」に戻っているのに対し、最大メモリ使用量は変わらず「16.83MB」のまま出力されます。
簡単ではありますが、メモリ使用量を確認したいポイントに対して、、、
print "[メモリ使用量]:". memory_get_usage() / (1024 * 1024) ."MB\n";
print "[メモリ最大使用量]:". memory_get_peak_usage() / (1024 * 1024) ."MB\n";
上記コードを差し込むこと、メモリ状況を監視できるかと思います。