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
?>
<?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 無內建函數直接取得變數大小,常用替代方案:
<?php
function varSize($var) {
return strlen(serialize($var));
}
$arr = range(1, 10000);
echo "陣列估算大小: " . formatBytes(varSize($arr)); // 輸出: ~80 KB
?>
<?php
function varSizePrintR($var) {
ob_start();
print_r($var);
$output = ob_get_clean();
// 移除縮排空白
$output = preg_replace("/\n\s+/", "\n", $output);
return strlen($output);
}
?>
<?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));` |
`memory_get_usage()` 是 PHP 記憶體可觀測性的基石。掌握「內部/實際記憶體區別、格式化輸出、變數大小估算三種方法、實務監控模式」,能有效定位記憶體洩漏、優化批次處理、建立效能基準。現代專案建議併用 APM 工具實現全鏈路記憶體監控。