PHP memory_get_usage(false) 返回当前脚本使用的内存量(以字节为单位),而 memory_get_usage(true) 返回当前脚本使用的内存量(以人类可读的格式显示)。

14
有人能解释一下$real_usage参数在memory_get_usage()中的确切区别吗? 手册中写道:

将其设置为TRUE以获取从系统分配的内存的实际大小。 如果未设置或设置为FALSE,则仅报告emalloc()使用的内存。

但是这有什么区别呢? 哪个值可以与memory_limit INI设置进行比较
对于一些长时间运行的脚本,我得到的实际使用量大约是250MB,而emalloc使用量只有50MB。这是怎么可能的?
我正在尝试分析一些内存泄漏问题,memory_get_usage()对我来说是一个重要的指标,我需要完全理解它。谢谢。

你可能已经浏览过这些内容,但仍然分享链接。 内存管理PHP内存基础知识。请阅读第二个链接的第二段最后一句话。 - Yogesh
链接已添加。您的意思是“当PHP以调试模式构建(--enable-debug)时,检测到的泄漏会被报告,在完美的世界中,它们永远不会到达部署。”?那这怎么回答我的问题呢? - Udo G
我认为我误将“build in”读成了“in”。对此我深表歉意。我理解为我们可以将调试模式设置为ON以查看内存泄漏。 - Yogesh
1个回答

8
真实内存是为PHP进程保留的内存量。PHP以大块方式保留内存,这个数量会小于等于memory_limit,并且在脚本执行期间可能会增加。例如,如果它填满一块内存,然后您尝试对新变量进行赋值,它将保留另一块内存。
如果将参数设置为FALSE,则仅报告PHP实际在保留内存中使用的内存量。每次分配新变量或调用函数等都会增加此内存量。
如果您想了解实际使用的内存量,则需要真实内存。
如果您正在调试或尝试优化代码,则可能更感兴趣的是emalloc()内存。这将使您能够在分配或调用函数之前和之后检查内存并计算增量。

我需要设置哪个参数来检测是否即将达到“memory_limit” INI设置?(为了内部缓存,我需要大量的内存,并且在必要时需要释放部分缓存以避免超出内存限制) - Udo G
这取决于您希望它接近memory_limit设置的程度。我可能建议将参数设置为FALSE以获取emalloc()使用情况。 - Luke Mills
根据我的测试(在PHP 5.5中),memory_limit INI设置基于memory_get_usage(true)的值。因此,在脚本崩溃之前,实际上可能使用的KB比最大值少得多。ini_set('memory_limit', '500K'); echo "内存限制: " . ini_get('memory_limit') . "\n"; $x = 'A'; for($i = 0 ; $i <= 100; $i++) { echo memory_get_usage(false). " vs " . memory_get_usage(true). "\n"; $x = $x . 'A'; }输出: 内存限制: 500K 226688 vs 262144 226992 vs 262144致命错误:超出了512000字节的允许内存大小。 - william

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