PHP memory_get_usage(false) 与 memory_get_usage(true)
Posted
技术标签:
【中文标题】PHP memory_get_usage(false) 与 memory_get_usage(true)【英文标题】:PHP memory_get_usage(false) vs memory_get_usage(true) 【发布时间】:2013-07-08 03:25:10 【问题描述】:有人可以澄清$real_usage
参数与memory_get_usage()
的确切区别是什么吗?
manual 声明:
将此设置为 TRUE 以获取从系统分配的内存的实际大小。 如果未设置或为 FALSE,则仅报告 emalloc() 使用的内存。
但是有什么区别呢?
哪个值与memory_limit
INI 设置相当?
对于一些长时间运行的脚本,我得到了 250MB 的实际使用量和 50MB 的 emalloc 使用量。这怎么可能?
我正在尝试分析一些内存泄漏问题,memory_get_usage()
对我来说是一个重要的指标,我需要完全理解。谢谢。
【问题讨论】:
你可能已经经历了这个仍然共享链接。 memory mangement 和 php basics of memory .. 请从第二个链接阅读第二段的最后一句话 已添加链接。您的意思是 “当 PHP 以调试模式 (--enable-debug) 构建时,会报告检测到的泄漏,在完美的世界中,它们永远不会进行部署。” ?这如何回答我的问题? 我想我把它“内置”误读为“内置”。我为此道歉。我读了它,因为我们可以将调试模式设置为 ON 以查看内存泄漏 【参考方案1】:实际内存是为 PHP 进程保留的内存量。 PHP 以大块的形式保留内存,这将是
如果您将该参数设置为 FALSE,它只报告 PHP 在保留内存中实际使用的内存量。每次分配新变量或调用函数等时,这都会增加。
如果您对实际使用的内存量感兴趣,那么您会想要真正的内存。
如果您正在调试或尝试调整一段代码,您可能会对 emalloc() 内存更感兴趣。这将允许您在分配或函数调用之前和之后检查内存并计算增量。
【讨论】:
如果我即将达到memory_limit
INI 设置,我需要检测哪个参数设置? (对于内部缓存,我需要大量内存,并且在必要时需要释放部分缓存以避免超出内存限制)
这取决于您希望它与 memory_limit 设置的接近程度。我可能建议将参数设置为 FALSE 以获取 emalloc() 用法。
根据我的测试(在 PHP 5.5 中)memory_limit
INI 设置基于 memory_get_usage(true)
的值。因此,您的脚本实际上可能在崩溃之前使用的 KB 数少于最大值。 <?php ini_set('memory_limit', '500K'); echo "memory limit: " . 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 字节已用完以上是关于PHP memory_get_usage(false) 与 memory_get_usage(true)的主要内容,如果未能解决你的问题,请参考以下文章
PHP 的 memory_get_usage 的 .NET 等价物是啥?