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

PHP memory_get_usage() 監控記憶體使用量:格式化輸出、參數差異與跨平台相容寫法

     編輯:PHP 相關知識

掌握腳本執行時的記憶體消耗對效能調優至關重要。PHP 提供 memory_get_usage() 取得當前分配記憶體,搭配 memory_get_peak_usage() 可得知峰值。本文示範格式化輸出、參數細節與 Windows/Linux 相容的備援函式。

基本用法與單位轉換

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

echo '目前記憶體:' . formatBytes(memory_get_usage(true)) . PHP_EOL;
echo '峰值記憶體:' . formatBytes(memory_get_peak_usage(true)) . PHP_EOL;
// 輸出範例:目前記憶體:256 KB
?>

參數 $real_usage 差異說明

  • memory_get_usage(false)(預設):回傳 PHP 內部記憶體管理器分配給腳本的記憶體(不含管理器本身開銷)。
  • memory_get_usage(true):回傳系統實際分配給 PHP 進程的記憶體(含管理器開銷),數值較大但更真實反映系統負載。

建議:效能分析時使用 true 參數;單純比較腳本內部分配差異可用 false。

跨平台相容備援函式(PHP < 5.2 或特殊環境)

if (!function_exists('memory_get_usage')) {
    function memory_get_usage($realUsage = false) {
        $pid = getmypid();
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            // Windows: 使用 tasklist
            exec('tasklist /FI "PID eq ' . $pid . '" /FO LIST', $output);
            return (int)preg_replace('/[^0-9]/', '', $output[5]) * 1024;
        } else {
            // Linux/Unix: 使用 ps
            exec("ps -o rss= -p $pid", $output);
            return (int)$output[0] * 1024; // ps 回傳 KB,轉為 Bytes
        }
    }
}

實戰應用場景

  1. 記憶體洩漏偵測:在長時間運行的 CLI 腳本(如 Queue Worker)中定期記錄峰值,超過閾值自動重啟。
  2. 大量資料處理優化:分批處理(Chunk)大型陣列或資料庫結果集,觀察記憶體曲線調整批次大小。
  3. 單元測試斷言:在測試中斷言特定操作的記憶體增長在預期範圍內。

相關設定參數

  • memory_limit(php.ini):單一腳本最大記憶體,預設 128M,CLI 可設為 -1 移除限制。
  • memory_get_peak_usage():取得執行以來的峰值記憶體,排查瞬間飆升問題的關鍵指標。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved