【PHP8.x】memory_get_peak_usage関数の使い方

memory_get_peak_usage関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

memory_get_peak_usage関数は、PHPスクリプトの実行開始から現在までに、割り当てられたメモリの中で最も多かったピーク時の使用量を取得するために使用される関数です。この関数を利用することで、スクリプトが一時的にどれくらいのメモリを必要とするのかを把握し、アプリケーションのメモリ使用状況を分析する手助けとなります。特に、大規模なデータ処理を行うスクリプトや、長時間稼働するサービスにおいて、メモリの効率的な管理や最適化、あるいはメモリリークの特定に役立ちます。

この関数は、オプションでreal_usageというブール型の引数を指定することができます。この引数を省略するかfalseに設定した場合、PHPが内部的に管理するメモリ(emalloc/efreeによって割り当てられたメモリ)のピーク使用量がバイト単位で返されます。これは、主にPHPスクリプトが直接的に使用するメモリの状況を示します。

一方、real_usage引数をtrueに設定すると、オペレーティングシステムから実際に割り当てられた物理メモリ全体のピーク使用量がバイト単位で返されます。これには、PHPエンジン自体が使用するメモリや、PHPの拡張機能などが割り当てたメモリも含まれるため、より広範囲なメモリ消費の状況を把握したい場合に有用です。返される値は常にバイト単位の整数値であり、この情報を活用することで、システムリソースを効果的に利用するための計画を立てることができます。

構文(syntax)

1memory_get_peak_usage(bool $real_usage = false): int

引数(parameters)

bool $real_usage = false

  • bool $real_usage = false: 実際のメモリ使用量(ハードウェアレベル)を取得するかどうかを示すブール値。デフォルトは false で、PHPのメモリ使用量を取得します。

戻り値(return)

int

この関数は、PHPスクリプトが実行されている間に消費されたメモリの最大量をバイト単位で返します。

サンプルコード

PHPでピークメモリ使用量をMBで取得する

1<?php
2
3/**
4 * PHPスクリプトの実行中に使用された最大メモリ量をMB単位で表示します。
5 *
6 * memory_get_peak_usage() 関数は、スクリプトの開始から現在までの
7 * PHPが割り当てたメモリのピーク量をバイト単位で返します。
8 * この関数は、スクリプトのリソース消費を分析し、メモリリークや
9 * 非効率なメモリ使用を特定するのに役立ちます。
10 */
11function displayPeakMemoryUsageInMb(): void
12{
13    // スクリプト開始直後の現在のピークメモリ使用量を取得し、MBに変換して表示
14    // round関数で小数点以下2桁に丸めて見やすくします。
15    echo "スクリプト開始直後のピークメモリ使用量: " . round(memory_get_peak_usage() / (1024 * 1024), 2) . " MB" . PHP_EOL;
16
17    // 大量のメモリを使用する操作の例
18    // この操作により、スクリプトのメモリ使用量が上昇し、ピーク値が更新される可能性があります。
19    $largeArray = [];
20    for ($i = 0; $i < 100000; $i++) {
21        // 各要素が約1KBの文字列を生成し、配列に追加
22        $largeArray[] = str_repeat('a', 1024);
23    }
24
25    // 複雑な操作後のピークメモリ使用量を取得し、MBに変換して表示
26    $peakMemoryBytes = memory_get_peak_usage();
27    $peakMemoryMB = $peakMemoryBytes / (1024 * 1024);
28    echo "データ処理後のピークメモリ使用量: " . round($peakMemoryMB, 2) . " MB" . PHP_EOL;
29
30    // オプションの引数 $real_usage を true に設定すると、
31    // PHPがシステムから実際に割り当てたメモリ量(OSレベルでの確保量)を取得できます。
32    // デフォルト(false)では、PHP内部で確保したメモリ量(emalloc()など)を返します。
33    $peakRealMemoryBytes = memory_get_peak_usage(true);
34    $peakRealMemoryMB = $peakRealMemoryBytes / (1024 * 1024);
35    echo "システム割り当てのピークメモリ使用量 (real_usage=true): " . round($peakRealMemoryMB, 2) . " MB" . PHP_EOL;
36
37    // $largeArray 変数を解放しても、memory_get_peak_usage()は
38    // スクリプト実行中に記録された過去の最大値を示すため、表示される値は下がりません。
39    unset($largeArray);
40    echo "データ解放後のピークメモリ使用量 (値は下がらない): " . round(memory_get_peak_usage() / (1024 * 1024), 2) . " MB" . PHP_EOL;
41}
42
43// 関数を実行してメモリ使用量を確認します
44displayPeakMemoryUsageInMb();
45
46?>

PHP 8のmemory_get_peak_usage()関数は、スクリプトの実行中にPHPが使用したメモリの最大値、すなわちピークメモリ使用量をバイト単位で取得します。この関数は、スクリプトのリソース消費を分析し、メモリ使用の効率化や潜在的なメモリリークを特定するのに役立ちます。

引数$real_usageはオプションで、デフォルトはfalseです。falseの場合、PHPが内部で割り当てたメモリ量(emalloc()などによるもの)を返します。trueを設定すると、PHPがシステムから実際に割り当てたメモリ量(OSレベルでの確保量)を返します。戻り値は常に整数型のバイト数です。

サンプルコードでは、スクリプト開始時と、大量の文字列を格納する配列を作成した後、それぞれのピークメモリ使用量をMB単位に変換して表示しています。これにより、データ処理がどの程度メモリを消費したかがわかります。また、$real_usagetrueにした場合のシステム割り当てメモリ量も確認できます。unset()で変数を解放しても、memory_get_peak_usage()は実行中に記録された過去の最大値を示すため、値が下がることはありません。この関数を活用することで、PHPアプリケーションのパフォーマンス改善に繋がります。

この関数は、スクリプト実行中にPHPが使用したメモリの「最大値(ピーク)」をバイト単位で返します。現在のメモリ使用量ではなく、スクリプト開始から最も多く使用された時点のメモリ量を示すため、一度記録されたピーク値はメモリが解放されても下がりません。取得した値はバイト単位ですので、MB単位で表示するには1024 * 1024で割る必要があります。引数$real_usagetrueにすると、PHPがシステムから実際に割り当てたメモリ量を取得でき、デフォルトのfalseとは異なる値を示す場合があります。これはメモリリークの検出やリソース消費の最適化に活用できます。

PHPでメモリ使用量の現在値とピーク値を確認する

1<?php
2
3/**
4 * memory_get_usage と memory_get_peak_usage の違いを示すサンプル
5 *
6 * memory_get_usage: スクリプト実行中の現時点でのメモリ使用量 (バイト) を返します。
7 * memory_get_peak_usage: スクリプト実行中に最も多く使用されたメモリ量 (バイト) を返します。
8 * 引数 `$real_usage` はデフォルトで false です。false の場合、PHP が割り当てたメモリのみを返します。
9 */
10function demonstrateMemoryUsageComparison(): void
11{
12    echo "--- メモリ使用量のデモンストレーション ---\n\n";
13
14    // 1. スクリプト開始時のメモリ使用量を記録
15    $startMemory = memory_get_usage();
16    $startPeakMemory = memory_get_peak_usage();
17    echo "スクリプト開始時:\n";
18    echo "  現在のメモリ使用量 (memory_get_usage): " . number_format($startMemory) . " バイト\n";
19    echo "  ピークメモリ使用量 (memory_get_peak_usage): " . number_format($startPeakMemory) . " バイト\n\n";
20
21    echo "--- 大量のメモリを消費する処理を開始 ---\n";
22
23    $largeArray = [];
24    $numElements = 100000; // 10万個の要素を持つ配列を作成
25
26    for ($i = 0; $i < $numElements; $i++) {
27        // 各要素に約100バイトの文字列を格納し、メモリを消費
28        $largeArray[] = str_repeat('a', 100);
29
30        // 2. 処理途中でメモリ使用量をチェック
31        if ($i == $numElements / 2) {
32            $midMemory = memory_get_usage();
33            $midPeakMemory = memory_get_peak_usage();
34            echo "  中間地点 ({$i}要素追加後):\n";
35            echo "    現在のメモリ使用量 (memory_get_usage): " . number_format($midMemory) . " バイト\n";
36            echo "    ピークメモリ使用量 (memory_get_peak_usage): " . number_format($midPeakMemory) . " バイト\n\n";
37        }
38    }
39
40    echo "--- 大量のメモリを消費する処理が完了 ---\n\n";
41
42    // 3. 処理完了後のメモリ使用量を記録
43    $endMemory = memory_get_usage();
44    $endPeakMemory = memory_get_peak_usage();
45    echo "処理完了時:\n";
46    echo "  現在のメモリ使用量 (memory_get_usage): " . number_format($endMemory) . " バイト\n";
47    echo "  ピークメモリ使用量 (memory_get_peak_usage): " . number_format($endPeakMemory) . " バイト\n\n";
48
49    // 4. 作成した大きな配列を unset してメモリを解放
50    // memory_get_usage の値は減少する可能性がありますが、
51    // memory_get_peak_usage の値は通常減少しません。
52    unset($largeArray);
53    $afterUnsetMemory = memory_get_usage();
54    $afterUnsetPeakMemory = memory_get_peak_usage();
55    echo "配列unset後 (メモリ解放後):\n";
56    echo "  現在のメモリ使用量 (memory_get_usage): " . number_format($afterUnsetMemory) . " バイト\n";
57    echo "  ピークメモリ使用量 (memory_get_peak_usage): " . number_format($afterUnsetPeakMemory) . " バイト\n\n";
58
59    echo "--- まとめ ---\n";
60    echo "  - `memory_get_usage()` は、スクリプトがその瞬間に使用しているメモリ量を返します。\n";
61    echo "    変数などが解放されると、この値は減少することがあります。\n";
62    echo "  - `memory_get_peak_usage()` は、スクリプト実行中に一時的にでも最も多く使用されたメモリ量を返します。\n";
63    echo "    一度記録されたピーク値は、その後メモリを解放しても減少しません。これは、\n";
64    echo "    アプリケーションがどれだけの最大メモリを必要としたかを知るのに役立ちます。\n";
65}
66
67// 関数を実行してデモンストレーションを開始
68demonstrateMemoryUsageComparison();
69

PHP 8のmemory_get_peak_usage関数は、スクリプト実行中に一時的にでも最も多く使用されたメモリ量(バイト)を整数値で取得します。引数$real_usageは、false(デフォルト)ならPHPが割り当てたメモリ量を、trueならOSが認識するメモリ総量を返します。

本関数は、現時点のメモリ使用量を示すmemory_get_usageとは異なる役割です。memory_get_usageが「その瞬間」のメモリ消費量を示す一方、memory_get_peak_usageは実行開始からの「最大」メモリ使用量を記録します。

サンプルコードは、メモリ消費と解放処理を通じ、両関数の違いを具体的に示します。memory_get_usageはメモリ解放で減少する可能性がある一方、memory_get_peak_usageは一度記録された最大値が減少しない点が確認できます。これにより、アプリケーションの最大メモリ要求を正確に把握できます。

memory_get_usageは現時点のメモリ使用量、memory_get_peak_usageはスクリプト実行中に最も多く使用されたメモリ量を示します。memory_get_peak_usageの値は、一度記録されるとメモリを解放しても通常減少しない点に注意が必要です。これは、プログラムが一度に必要とした最大のメモリ量を把握するために重要です。また、$real_usage引数をtrueにすると、PHPがOSから実際に確保したメモリ総量を測定するため、デフォルトのfalseの場合よりも大きな値を示すことがあります。メモリ利用状況の詳細な分析にはtrueを指定することが有効です。

関連コンテンツ

関連プログラミング言語

【PHP8.x】memory_get_peak_usage関数の使い方 | いっしー@Webエンジニア