PHP Conference Japan 2024

memory_get_peak_usage

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

memory_get_peak_usage傳回 PHP 分配的記憶體峰值

說明

memory_get_peak_usage(bool $real_usage = false): int

傳回已分配給您的 PHP 腳本的記憶體峰值(以位元組為單位)。

參數

real_usage

將此設定為 true 以取得從系統分配的實際記憶體大小。如果未設定或設定為 false,則只會回報 emalloc() 使用的記憶體。

傳回值

傳回記憶體峰值(以位元組為單位)。

參見

新增註解

使用者貢獻的註解 1 則註解

stanislav dot eckert at vizson dot de
7 年前
memory_get_peak_usage() 僅用於擷取 PHP(或您正在執行的腳本)的最高記憶體用量。如果您需要整個系統的總記憶體用量,以下函式可能會有幫助。它會以百分比(不含百分比符號)或位元組為單位擷取記憶體用量,方法是返回一個包含系統可用記憶體和總記憶體的陣列。已在 Windows (7) 和 Linux(在 Raspberry Pi 2 上)進行測試

<?php

// Returns used memory (either in percent (without percent sign) or free and overall in bytes)
function getServerMemoryUsage($getPercentage=true)
{
$memoryTotal = null;
$memoryFree = null;

if (
stristr(PHP_OS, "win")) {
// Get total physical memory (this is in bytes)
$cmd = "wmic ComputerSystem get TotalPhysicalMemory";
@
exec($cmd, $outputTotalPhysicalMemory);

// Get free physical memory (this is in kibibytes!)
$cmd = "wmic OS get FreePhysicalMemory";
@
exec($cmd, $outputFreePhysicalMemory);

if (
$outputTotalPhysicalMemory && $outputFreePhysicalMemory) {
// Find total value
foreach ($outputTotalPhysicalMemory as $line) {
if (
$line && preg_match("/^[0-9]+\$/", $line)) {
$memoryTotal = $line;
break;
}
}

// Find free value
foreach ($outputFreePhysicalMemory as $line) {
if (
$line && preg_match("/^[0-9]+\$/", $line)) {
$memoryFree = $line;
$memoryFree *= 1024; // convert from kibibytes to bytes
break;
}
}
}
}
else
{
if (
is_readable("/proc/meminfo"))
{
$stats = @file_get_contents("/proc/meminfo");

if (
$stats !== false) {
// Separate lines
$stats = str_replace(array("\r\n", "\n\r", "\r"), "\n", $stats);
$stats = explode("\n", $stats);

// Separate values and find correct lines for total and free mem
foreach ($stats as $statLine) {
$statLineData = explode(":", trim($statLine));

//
// Extract size (TODO: It seems that (at least) the two values for total and free memory have the unit "kB" always. Is this correct?
//

// Total memory
if (count($statLineData) == 2 && trim($statLineData[0]) == "MemTotal") {
$memoryTotal = trim($statLineData[1]);
$memoryTotal = explode(" ", $memoryTotal);
$memoryTotal = $memoryTotal[0];
$memoryTotal *= 1024; // convert from kibibytes to bytes
}

// Free memory
if (count($statLineData) == 2 && trim($statLineData[0]) == "MemFree") {
$memoryFree = trim($statLineData[1]);
$memoryFree = explode(" ", $memoryFree);
$memoryFree = $memoryFree[0];
$memoryFree *= 1024; // convert from kibibytes to bytes
}
}
}
}
}

if (
is_null($memoryTotal) || is_null($memoryFree)) {
return
null;
} else {
if (
$getPercentage) {
return (
100 - ($memoryFree * 100 / $memoryTotal));
} else {
return array(
"total" => $memoryTotal,
"free" => $memoryFree,
);
}
}
}

function
getNiceFileSize($bytes, $binaryPrefix=true) {
if (
$binaryPrefix) {
$unit=array('B','KiB','MiB','GiB','TiB','PiB');
if (
$bytes==0) return '0 ' . $unit[0];
return @
round($bytes/pow(1024,($i=floor(log($bytes,1024)))),2) .' '. (isset($unit[$i]) ? $unit[$i] : 'B');
} else {
$unit=array('B','KB','MB','GB','TB','PB');
if (
$bytes==0) return '0 ' . $unit[0];
return @
round($bytes/pow(1000,($i=floor(log($bytes,1000)))),2) .' '. (isset($unit[$i]) ? $unit[$i] : 'B');
}
}

// Memory usage: 4.55 GiB / 23.91 GiB (19.013557664178%)
$memUsage = getServerMemoryUsage(false);
echo
sprintf("Memory usage: %s / %s (%s%%)",
getNiceFileSize($memUsage["total"] - $memUsage["free"]),
getNiceFileSize($memUsage["total"]),
getServerMemoryUsage(true)
);

?>

getNiceFileSize() 函式並非必需。只是用來縮短以位元組為單位的檔案大小。

注意:如果您需要伺服器負載(CPU 使用率),我也寫了一個不錯的函式來取得它:https://php.dev.org.tw/manual/en/function.sys-getloadavg.php#118673
To Top