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 条笔记

33
stanislav dot eckert at vizson dot de
7 年前
memory_get_peak_usage() 用于检索 PHP(或正在运行的脚本)的最高内存使用量。如果您需要整个系统的总内存使用量,以下函数可能会有所帮助。它通过返回一个包含系统空闲内存和总内存的数组来检索内存使用量,以百分比(不带百分号)或字节为单位。已在 Windows(7)和 Linux(在 Raspberry Pi 2 上)上测试。

<?php

// 返回已使用内存(以百分比显示(无百分号)或以字节显示的空闲内存和总内存)
function getServerMemoryUsage($getPercentage=true)
{
$memoryTotal = null;
$memoryFree = null;

if (
stristr(PHP_OS, "win")) {
// 获取总物理内存(以字节为单位)
$cmd = "wmic ComputerSystem get TotalPhysicalMemory";
@
exec($cmd, $outputTotalPhysicalMemory);

// 获取空闲物理内存(以 KiB 为单位!)
$cmd = "wmic OS get FreePhysicalMemory";
@
exec($cmd, $outputFreePhysicalMemory);

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

// 查找空闲值
foreach ($outputFreePhysicalMemory as $line) {
if (
$line && preg_match("/^[0-9]+\$/", $line)) {
$memoryFree = $line;
$memoryFree *= 1024; // 将 KiB 转换为字节
break;
}
}
}
}
else
{
if (
is_readable("/proc/meminfo"))
{
$stats = @file_get_contents("/proc/meminfo");

if (
$stats !== false) {
// 分隔行
$stats = str_replace(array("\r\n", "\n\r", "\r"), "\n", $stats);
$stats = explode("\n", $stats);

// 分隔值并找到总内存和空闲内存的正确行
foreach ($stats as $statLine) {
$statLineData = explode(":", trim($statLine));

//
// 提取大小(TODO:似乎总内存和空闲内存的两个值总是以“kB”为单位。这是正确的吗?
//

// 总内存
if (count($statLineData) == 2 && trim($statLineData[0]) == "MemTotal") {
$memoryTotal = trim($statLineData[1]);
$memoryTotal = explode(" ", $memoryTotal);
$memoryTotal = $memoryTotal[0];
$memoryTotal *= 1024; // 将 KiB 转换为字节
}

// 空闲内存
if (count($statLineData) == 2 && trim($statLineData[0]) == "MemFree") {
$memoryFree = trim($statLineData[1]);
$memoryFree = explode(" ", $memoryFree);
$memoryFree = $memoryFree[0];
$memoryFree *= 1024; // 将 KiB 转换为字节
}
}
}
}
}

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');
}
}

// 内存使用情况: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.net/manual/en/function.sys-getloadavg.php#118673
To Top