PHP memory_get_usage

med*_*edk 7 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();

?>
Run Code Online (Sandbox Code Playgroud)

哪个回报:

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
Run Code Online (Sandbox Code Playgroud)

这使:

1)5355216 - 355120 = 5000096字节

2)5356008 - 355120 = 5000888字节

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

riw*_*alk 7

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

返回当前分配给PHP脚本的内存量(以字节为单位).

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

str_repeat()不应该使用那么多内存的第二个断言并没有看到整个图片.

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

s = ""
for(i=0; i<100000; i++)
    s += "hello"
Run Code Online (Sandbox Code Playgroud)

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

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

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


Sam*_*fel 6

根据php手册,memory_get_usage返回分配给php 的内存量,不一定是使用的量.

  • @ mohamed87,我无法解释清楚.*在查看内存使用情况时,__必须查看__interpreter__正在使用的内存*.看看大局.memory_get_usage()给你的数字是正确的数字. (2认同)