【PHP8.x】memory_get_usage関数の使い方
memory_get_usage関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
memory_get_usage関数は、PHPスクリプトが現在使用しているメモリ量をバイト単位で取得する関数です。システムエンジニアを目指す初心者の方にとって、メモリ使用量を把握することは、効率的なプログラム開発やサーバ運用において非常に重要です。
この関数を使用することで、スクリプトのどの部分が多くのメモリを消費しているのかを特定し、メモリリークの発見や最適化のヒントを得ることができます。例えば、大きな配列やオブジェクトを扱う処理、データベースからの大量のデータ取得など、メモリ消費が大きくなる箇所を特定し、改善策を検討することができます。
memory_get_usage関数には、オプションでreal_usageという引数を指定できます。real_usageをtrueに設定した場合、OSから割り当てられた実際のメモリ量を返します。falseまたは省略した場合は、PHPのメモリマネージャが管理しているメモリ量を返します。real_usageをtrueにすることで、より正確なメモリ使用量を把握できますが、多少パフォーマンスに影響を与える可能性があります。
取得したメモリ使用量は、ログに出力したり、グラフで可視化したりすることで、メモリ使用量の推移を監視し、問題発生時の早期発見に役立てることができます。また、設定されたメモリ制限を超えないように、プログラム内でメモリ使用量をチェックし、必要に応じて処理を中断したり、警告を出したりするなどの対策を講じることも可能です。
memory_get_usage関数は、スクリプトのパフォーマンスチューニングやメモリ管理において、非常に強力なツールとなります。
構文(syntax)
1memory_get_usage ( bool $real_usage = false ): int
引数(parameters)
bool $real_usage = false
- bool $real_usage = false: メモリ使用量をリアルタイムで取得するかどうかを指定するブール値。
trueを指定すると、実際のメモリ使用量(メモリ割り当てと解放の総量)を取得します。デフォルトはfalseで、PHP が管理しているメモリ使用量のみを取得します。
戻り値(return)
int
現在のPHPスクリプトが使用しているメモリ使用量をバイト単位で返します。
サンプルコード
PHPメモリ使用量を人間が読める形式に変換する
1<?php 2 3/** 4 * バイト数を人間が読みやすい形式(B, KB, MB, GBなど)に変換します。 5 * 6 * @param int $bytes バイト単位のメモリ量 (非負の整数を想定) 7 * @param int $precision 小数点以下の桁数 8 * @return string フォーマットされたメモリ量 9 */ 10function formatBytes(int $bytes, int $precision = 2): string 11{ 12 $units = ['B', 'KB', 'MB', 'GB', 'TB']; 13 14 // メモリ量が0の場合は0Bを返す 15 if ($bytes === 0) { 16 return '0 B'; 17 } 18 19 // 適切な単位のインデックスを計算 (1024バイト = 1KB の関係) 20 $power = floor(log($bytes, 1024)); 21 22 // 適切な単位で割って、指定された精度で丸める 23 $formattedValue = round($bytes / (1024 ** $power), $precision); 24 25 // フォーマットされた値と単位を結合して返す 26 return sprintf('%.'.$precision.'f %s', $formattedValue, $units[$power]); 27} 28 29// ----------------------------------------------------------------------------- 30// memory_get_usage() の使用例 31// ----------------------------------------------------------------------------- 32 33echo "PHPスクリプトのメモリ使用量計測を開始します。\n\n"; 34 35// スクリプト開始時のメモリ使用量を取得 36// memory_get_usage() のデフォルト ($real_usage = false) は、 37// PHPのメモリマネージャが割り当てたメモリ量(emalloc/efree)を返します。 38$startMemoryDefault = memory_get_usage(); 39 40// memory_get_usage(true) は、$real_usageをtrueに設定することで、 41// PHPプロセスがオペレーティングシステムから実際に要求したメモリ量(malloc/free)を返します。 42$startMemoryReal = memory_get_usage(true); 43 44echo "スクリプト開始時のメモリ使用量:\n"; 45echo "- PHP割り当て(デフォルト): " . formatBytes($startMemoryDefault) . "\n"; 46echo "- システム割り当て(リアル): " . formatBytes($startMemoryReal) . "\n\n"; 47 48// 大量のデータを作成してメモリを消費させる例 49echo "大量のデータを作成してメモリを消費させます...\n"; 50$largeArray = []; 51// 各文字列が約1KB (1024バイト) のデータを5000個追加し、合計約5MB以上のメモリを消費させます。 52for ($i = 0; $i < 5000; $i++) { 53 $largeArray[] = str_repeat('a', 1024); 54} 55 56echo "データ作成後のメモリ使用量:\n"; 57$afterMemoryDefault = memory_get_usage(); 58$afterMemoryReal = memory_get_usage(true); 59 60echo "- PHP割り当て(デフォルト): " . formatBytes($afterMemoryDefault) . "\n"; 61echo "- システム割り当て(リアル): " . formatBytes($afterMemoryReal) . "\n\n"; 62 63echo "増えたメモリ使用量:\n"; 64// 差分を計算し、増加したメモリ量を表示します。 65echo "- PHP割り当て(デフォルト): " . formatBytes($afterMemoryDefault - $startMemoryDefault) . "\n"; 66echo "- システム割り当て(リアル): " . formatBytes($afterMemoryReal - $startMemoryReal) . "\n\n"; 67 68// 注意: unset() で配列を解放しても、PHPのガベージコレクションやメモリ最適化により、 69// 即座にオペレーティングシステムへメモリが解放されるとは限りません。 70// 必要であれば、以下のコメントを解除して試してみてください。 71// unset($largeArray); 72// echo "データ解放後のメモリ使用量:\n"; 73// echo "- PHP割り当て(デフォルト): " . formatBytes(memory_get_usage()) . "\n"; 74// echo "- システム割り当て(リアル): " . formatBytes(memory_get_usage(true)) . "\n"; 75 76echo "スクリプトのメモリ使用量計測を終了します。\n"; 77
PHPのmemory_get_usage関数は、実行中のPHPスクリプトが消費しているメモリの量をバイト単位で取得します。PHP 8で利用でき、スクリプトのメモリ使用量監視に役立ちます。
引数$real_usageはオプションの真偽値で、デフォルトはfalseです。falseの場合、PHPのメモリマネージャがスクリプトに割り当てたメモリ量、PHPが内部管理するメモリ量を返します。これは主に変数やオブジェクトの生成による消費です。
$real_usageにtrueを指定すると、PHPプロセスがオペレーティングシステムから実際に要求しているメモリの総量を返します。この値にはPHPのオーバーヘッドやOSレベルのメモリ管理も含むため、より大きな値になります。
戻り値は整数型(int)で、メモリ量をバイト数で示します。サンプルコードでは、処理の前後でこの関数を呼び出し、特定の操作がどれだけメモリを消費したかを測定し、変化を把握できます。
memory_get_usage()関数は、引数$real_usageの指定により計測対象が異なります。デフォルト(false)はPHPが内部で管理するメモリ量、trueを指定するとオペレーティングシステムから実際に使用している物理メモリに近い値を取得できます。この違いを理解し、計測目的に合わせて使い分けてください。
また、変数を解放しても、PHPのガベージコレクションやメモリ管理の仕組み上、メモリが即座にOSへ返還されるとは限りません。計測結果を解釈する際は、この点に留意し、環境やPHPの設定も考慮して活用してください。
PHPメモリ使用量:現在値 vs ピーク値の確認
1<?php 2 3// スクリプト開始時のメモリ情報を取得し、表示します。 4// memory_get_usage() はPHPが内部的に管理するメモリ量を返します。 5// memory_get_usage(true) はOSからプロセスに割り当てられた実際のメモリ量を返します。 6echo "--- スクリプト開始時のメモリ情報 ---\n"; 7$startMemoryUsagePhp = memory_get_usage(); 8$startMemoryUsageReal = memory_get_usage(true); 9echo "開始時 (PHP管理): " . round($startMemoryUsagePhp / (1024 * 1024), 2) . " MB\n"; 10echo "開始時 (実メモリ): " . round($startMemoryUsageReal / (1024 * 1024), 2) . " MB\n\n"; 11 12// 大量のデータを生成し、メモリを消費させる処理を行います。 13echo "--- メモリ消費処理を開始 ---\n"; 14$largeArray = []; 15$numElements = 100000; // 配列の要素数 16for ($i = 0; $i < $numElements; $i++) { 17 // 各要素に1KBの文字列を追加し、メモリを消費させます。 18 $largeArray[] = str_repeat('a', 1000); 19} 20echo "--- メモリ消費処理を終了 ---\n\n"; 21 22// メモリ消費処理直後のメモリ情報を取得し、表示します。 23echo "--- メモリ消費処理直後のメモリ情報 ---\n"; 24$afterProcessMemoryUsagePhp = memory_get_usage(); 25$afterProcessMemoryUsageReal = memory_get_usage(true); 26echo "処理直後 (PHP管理): " . round($afterProcessMemoryUsagePhp / (1024 * 1024), 2) . " MB\n"; 27echo "処理直後 (実メモリ): " . round($afterProcessMemoryUsageReal / (1024 * 1024), 2) . " MB\n\n"; 28 29// 生成した大きな配列を解放し、メモリがどのように変化するかを確認します。 30// PHP管理メモリは減る可能性がありますが、OSが割り当てた実メモリはすぐには減少しないことがあります。 31unset($largeArray); 32 33echo "--- 変数解放後のメモリ情報 ---\n"; 34$afterUnsetMemoryUsagePhp = memory_get_usage(); 35$afterUnsetMemoryUsageReal = memory_get_usage(true); 36echo "解放後 (PHP管理): " . round($afterUnsetMemoryUsagePhp / (1024 * 1024), 2) . " MB\n"; 37echo "解放後 (実メモリ): " . round($afterUnsetMemoryUsageReal / (1024 * 1024), 2) . " MB\n\n"; 38 39// スクリプト実行中に割り当てられたメモリの最大量(ピーク値)を取得し、表示します。 40// memory_get_peak_usage() はスクリプト開始から現在までの最大メモリ使用量を返します。 41echo "--- ピークメモリ情報 ---\n"; 42$peakMemoryUsagePhp = memory_get_peak_usage(); 43$peakMemoryUsageReal = memory_get_peak_usage(true); 44echo "ピーク時 (PHP管理): " . round($peakMemoryUsagePhp / (1024 * 1024), 2) . " MB\n"; 45echo "ピーク時 (実メモリ): " . round($peakMemoryUsageReal / (1024 * 1024), 2) . " MB\n\n"; 46 47/* 48 * まとめ: 49 * - memory_get_usage(): 現在のスクリプトのメモリ使用量を返します。 50 * - memory_get_peak_usage(): スクリプト実行開始から現在までの最大メモリ使用量(ピーク値)を返します。 51 * - 引数 `$real_usage = true` を指定すると、PHPが内部的に管理するメモリだけでなく、 52 * OSからプロセスに割り当てられた実際のメモリ量(より大きな値を示すことが多い)を返します。 53 * - 変数を解放しても、`memory_get_usage(true)` で得られる実メモリは、 54 * OSがすぐには解放せず、プロセスに保持し続けることがあるため、すぐに減少しない場合があります。 55 */
PHPのmemory_get_usage関数は、現在実行中のPHPスクリプトが使用しているメモリ量をバイト単位の整数値として取得します。この関数は、アプリケーションのメモリ使用状況を監視し、最適化のヒントを得る際に役立ちます。引数$real_usageにfalse(デフォルト)を指定すると、PHPが内部的に管理するメモリ量が返されますが、trueを指定すると、OSからプロセスに割り当てられた実際のメモリ量が返されます。後者はPHPが利用できるメモリプールの総量を示すため、多くの場合、より大きな値となります。
サンプルコードでは、スクリプト開始時のメモリ使用量を確認した後、大量のデータを生成して意図的にメモリを消費させます。メモリ消費処理の前後でmemory_get_usageを呼び出し、使用量の変化を観察しています。また、unsetで大きな配列を解放した後もメモリ使用量を測定しており、PHPが管理するメモリは減少する可能性がありますが、OSから割り当てられた実メモリはすぐに解放されず、プロセスに保持され続ける場合があることを示しています。
さらに、memory_get_peak_usage関数も利用して、スクリプトの実行開始から現在までに消費されたメモリの最大量(ピーク値)を取得しています。こちらも$real_usage引数により、PHP管理メモリのピーク値と、OS割り当ての実メモリのピーク値の両方を確認できます。memory_get_usageが現在のメモリ状況を示すのに対し、memory_get_peak_usageはスクリプトが最も多くのメモリを必要とした時点を把握するのに有用です。これらの関数を使い分けることで、PHPアプリケーションのメモリフットプリントを詳細に分析し、効率的なシステム開発に繋げることができます。
memory_get_usage()は現在のPHPスクリプトのメモリ使用量を、memory_get_peak_usage()はスクリプト実行開始から現在までの最大メモリ使用量(ピーク値)をそれぞれ返します。引数にtrueを指定すると、PHPが内部的に管理するメモリ量だけでなく、OSがプロセスに割り当てた実際のメモリ量(通常はPHP管理分より大きい値)を確認できます。変数をunsetで解放しても、OSがプロセスに割り当てた実メモリはすぐに減少せず保持される場合があるため、memory_get_usage(true)の値は即座には減少しない点に注意が必要です。これらの関数はメモリ最適化やリークの特定に役立ちます。