掌握腳本執行時的記憶體消耗對效能調優至關重要。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
?>
memory_get_usage(false)(預設):回傳 PHP 內部記憶體管理器分配給腳本的記憶體(不含管理器本身開銷)。memory_get_usage(true):回傳系統實際分配給 PHP 進程的記憶體(含管理器開銷),數值較大但更真實反映系統負載。建議:效能分析時使用 true 參數;單純比較腳本內部分配差異可用 false。
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
}
}
}
memory_limit(php.ini):單一腳本最大記憶體,預設 128M,CLI 可設為 -1 移除限制。memory_get_peak_usage():取得執行以來的峰值記憶體,排查瞬間飆升問題的關鍵指標。