首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP memory_get_usage() 記憶體監控完整指南:基礎用法、格式化輸出與變數大小估算

     編輯:PHP 綜合知識

函數原型

memory_get_usage(bool $real_usage = false): int
  • $real_usage = false (預設):回傳 PHP 分配給腳本的記憶體 (emalloc 管理的內部記憶體)。
  • $real_usage = true:回傳系統實際分配給 PHP 進程的記憶體 (含分配器開銷、未使用的緩衝區)。

支援版本:PHP 4.3.2+, PHP 5+

基礎用法:監控記憶體變化

<?php
echo "初始: " . memory_get_usage() . " bytes\n"; // 62328

$var = str_repeat("liuhui", 10000); // 佔用記憶體
echo "分配後: " . memory_get_usage() . " bytes\n"; // 122504

unset($var); // 釋放
echo "釋放後: " . memory_get_usage() . " bytes\n"; // 62416
?>

格式化輸出:人類可讀單位 (B/KB/MB/GB)

<?php
function formatBytes($bytes, $precision = 2) {
    $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
    if ($bytes == 0) return '0 B';
    $pow = floor(log($bytes, 1024));
    $pow = min($pow, count($units) - 1);
    $value = $bytes / (1024 ** $pow);
    return round($value, $precision) . ' ' . $units[$pow];
}

echo formatBytes(memory_get_usage(true)); // 輸出範例: 256 KB
?>

進階:估算變數/陣列記憶體佔用

PHP 無內建函數直接取得變數大小,常用替代方案:

方法 1:序列化長度估算 (快速、近似)

<?php
function varSize($var) {
    return strlen(serialize($var));
}

$arr = range(1, 10000);
echo "陣列估算大小: " . formatBytes(varSize($arr)); // 輸出: ~80 KB
?>

方法 2:輸出緩衝捕獲 `print_r` (較精確含結構)

<?php
function varSizePrintR($var) {
    ob_start();
    print_r($var);
    $output = ob_get_clean();
    // 移除縮排空白
    $output = preg_replace("/\n\s+/", "\n", $output);
    return strlen($output);
}
?>

方法 3:記憶體差值法 (最直觀)

<?php
function measureVar($var) {
    $before = memory_get_usage();
    $copy = $var; // 複製一份 (引用計數 +1,實際記憶體增長極小)
    // 強制深複製 (僅供測試)
    $deepCopy = unserialize(serialize($var));
    $after = memory_get_usage();
    return $after - $before;
}
?>

實務應用場景

場景用法
長時間運行腳本 (CLI) 記憶體洩漏偵測每輪迴圈記錄 `memory_get_usage(true)`,趨勢上升則檢查未釋放資源
大量資料處理分批優化處理前後記憶體差值決定批次大小,避免超過 `memory_limit`
效能分析報告關鍵節點記錄記憶體,生成火焰圖/時間線
單元測試斷言記憶體上限`$this->assertLessThan(50 * 1024 * 1024, memory_get_usage(true));`

常見誤區與注意事項

  • 非即時釋放:`unset($var)` 後記憶體不一定立即歸還給 OS,PHP 內部分配器會保留供下次使用。`memory_get_usage(true)` 較能反映實際 RSS。
  • GC 影響:循環引用需等待 GC (`gc_collect_cycles()`) 才會釋放。
  • Opcode 快取:啟用 OPcache 會增加基線記憶體,但屬於共享記憶體,不計入單進程 `memory_get_usage`。
  • 生產環境監控:建議結合 Prometheus + php-fpm exporter、Datadog、New Relic 等 APM 工具進行持續監控,而非僅靠代碼埋點。

結語

`memory_get_usage()` 是 PHP 記憶體可觀測性的基石。掌握「內部/實際記憶體區別、格式化輸出、變數大小估算三種方法、實務監控模式」,能有效定位記憶體洩漏、優化批次處理、建立效能基準。現代專案建議併用 APM 工具實現全鏈路記憶體監控。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved