PHP - memory_get_usage() 的奇怪行为

4

我正在尝试获取PHP变量的真实大小(内存使用量)。我知道没有直接的方法可以实现这一点,但有一个简单的“hack”方法,可以使用memory_get_usage()。

<?php

function varSize()
{
    $s = memory_get_usage();
    $x = true;
    echo memory_get_usage() - $s;
}

varSize();

echo '<br>';

$s = memory_get_usage();
$x = true;
echo memory_get_usage() - $s;

echo '<br>';

$s = memory_get_usage();
$x = unserialize(serialize(true));
echo memory_get_usage() - $s;

?>

这段代码分别返回64、160、0。为什么会这样呢?前两个变量几乎完全一样! 为什么会出现这种情况,如何获得真正的变量大小?

1
在编程中,“使用”这里意味着“分配”,所以在第二个例子中,它比原先多分配了160个,然后没有释放,在第三个例子中,它显然不需要更多,因此“memory_get_usage() - $s = 0”。 - birdspider
没有得到你的答案。您能否请再解释一下? - Onin
memory_get_usage 不会报告每个变量或类似变量的内存使用情况,而是报告已(解)分配的内存“块”的使用情况。例如,如果PHP从0.5MB开始,然后执行一些操作并决定需要1MB的额外内存,则您只能测量从0.5MB到1.5MB的更改,因为它测量的是内存分配情况。这与每个变量的内存使用情况相反。由于分配内存不是免费的,并且它试图将分配调用保持在合理的最小值,因此它几乎总是会分配比当前需要更多的内存。 - birdspider
2个回答

1

我一段时间前在互联网搜索中发现了这些函数,并在我的脚本中使用它们(抱歉原作者,我丢失了链接以便在此处给你信用)。您可以将这些函数包含在您的代码中,使事情更加模块化和易于阅读,然后在需要时调用memoryusage函数,例如...

// This function converts the number of bytes sent to it to kb, mb, gb, tb, pb as appropriate based on the size of memory (powers of 1024)
function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

// This function gets current PHP memory use and returns an approximate (rounded) figure back in: bytes, kb, mb, gb, tb, or pb as appropriate
function memoryusage() {
    return convert(memory_get_usage(true));
}

....

// This is me wanting to know how much memory is being used at this point of the script
$memuse = memoryusage();

...

1

每次使用 memory_get_usage(true),您都会得到答案。

如果未传递 true,则返回由 emalloc 使用的内存。您可以在 函数定义 中了解更多信息。


使用 memory_get_usage(true) 返回 0,0,0。正如您所了解的,它不能是真实大小。 - Onin
这是一种非常奇怪的行为,如果不传递true参数,但是如果传递true参数,PHP会告诉你它已经被系统分配了多少内存。而0表示PHP已经有足够的内存来分配一个真变量。 对于一些大的变量,它将返回新分配的集合。 - anwerj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接