PHP memory_get_usage

时间:2010-10-24 22:20:21

标签: php memory resources

我遇到了PHP的memory_get_usage()memory_get_peak_usage()

问题是我发现这两个函数不提供当前脚本使用的实际内存。 我的测试脚本是:

<?php

echo memory_get_usage();

echo '<br />';

$a = str_repeat('hello', 100000);

echo '<br />';

echo memory_get_usage();

echo '<br />';

echo memory_get_peak_usage();

?>

返回:

355120

5355216

5356008

你对此有何看法?

第一个值是在执行str_repeat()之前,因此它必须是0的值。

第二个是在整个过程之后,可以使值大于0但不是那么大的值。

第三个是“峰值”值,它略大于第二个,因为我认为它应该是处理微秒中的最大值。

那么你认为当前脚本的内存消耗的实际值应该是这样的:

memory_usage = the second memory usage - the first memory usage

peak_memory_usage = the third (peak_usage) - the first memory usage

给出:

1)5355216 - 355120 = 5000096字节

2)5356008 - 355120 = 5000888字节

如果这是它的工作方式,我假设第一个355120字节是apache和其他模块使用的整个系统分配的内存,因为当你增加或减少重复次数时,第一个值永远不会改变str_repeat(),只有过程增加或减少后的两个值,但永远不会小于第一个值。

3 个答案:

答案 0 :(得分:7)

好的,你的第一个断言第一个memory_get_usage()应为0是错误的。根据PHP的文档:

  

返回内存量   字节,当前正在   已分配给您的PHP脚本。

您的脚本正在运行,因此必须为其分配部分内存。第一个电话会告诉您这是多少。

你的第二个断言,即str_repeat()不应该使用那么多内存,而不是全貌。

你有字符串“hello”(使用5个字节)重复100,000次,总共500,000个字节......最小值。问题是,PHP是如何执行此操作的?他们使用这样的代码吗? (伪代码):

s = ""
for(i=0; i<100000; i++)
    s += "hello"

此代码要求您为for循环的每次迭代重新分配一个新字符串。现在我不能假装说我知道PHP如何实现str_repeat(),但你必须非常小心如何使用内存来降低内存使用率。从事物的出现来看,他们并没有尽可能地管理这个功能中的记忆。

第三,峰值内存使用量与当前内存使用量之间的差异可能来自使函数调用str_repeat()所需的堆栈,以及该函数中所需的任何局部变量。函数返回时可能会回收内存。

最后,Apache在不同的进程中运行,我们正在处理虚拟内存。 Apache所做的任何事都不会影响memory_get_usage()的结果,因为进程不会“共享”虚拟内存。

答案 1 :(得分:6)

根据php手册,memory_get_usage将分配的内存量返回给php,不一定是正在使用的数量。

答案 2 :(得分:2)

在我的情况下(Mac OS X 10.5上的PHP 5.3.3),您的脚本会打印出来:

323964

824176

824980

现在,第二次测量和第一次测量之间的差异给出500212,这非常接近“你好”(5)乘以100,000的长度。所以我不会在这里说出惊喜。由于在评估这些语句时进行了一些临时分配,因此峰值会更大。

(您的其他问题已经回答)