計算機儲存器的大小通常用位元組來表示,PHP 可通過 memory_get_peak_usage
函式來獲取記憶體使用情況
echo memory_get_peak_usage();
// 18386056
這種顯示方式不是很直觀,如果能用對應的單位的表示的話會好很多
echo formatBytes(memory_get_peak_usage());
// 17.53 mb
下面我們來手動實現該函式。
首先,需要掌握一些基本常識
- 1 Byte = 2 的零次方 = 1024 的 0 次方 = 1
- 1 KB = 2 的 10 次方 = 1024 的 1 次方
- 1 MB = 2 的 20 次方 = 1024 * 1024 = 1024 的 2 次方
- 1 GB = 2 的 30 次方 = 1024 1024 1024 = 1024 的 3 次方
示例,將 3145728 位元組格式化(列印 3 mb)。
$bytes = 3145728;
建立單位陣列
$units = ["b", "kb", "mb", "gb", "tb"];
陣列的索引剛好對應 1024 的對應次方,比如 kb
的索引為 1, 對應 1024 的一次方。因此,我們只需要算出對應的索引(次方)即可知道該位元組數適用的單位。
因為 3145728 = 3 * 1024 * 1024
,只需要使用對數即可算出索引
$base = log($bytes, 1024);
// 2.15
$index = floor($base);
// 2
得出對應的單位
$unit = $units[$index];
// mb
接下來,計算位元組數轉換為對應單位的數值,分為兩步
- 計算 1 MB 對應的位元組數
- 總的位元組數除以 1 MB 對應的位元組數
$unitBytes = pow(1024, $index);
$memory = $bytes / $unitBytes;
最後,返回格式化的值即可
$result = $memory ." ". $unit;
完整函式
function formatBytes(int $bytes, int $precision = 2) : string
{
$units = ["b", "kb", "mb", "gb", "tb"];
if($bytes <= 0){
return false;
}
$index = floor(log($bytes, 1024));
if($index > 4) {
return false;
}
$memory = $bytes / pow(1024, $index);
return round($memory, $precision) ." " . $units[$index];
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結