Memory management PHP CLI-检测内存浪费的位置

Memory management PHP CLI-检测内存浪费的位置,memory-management,php,memory-optimization,Memory Management,Php,Memory Optimization,我正在为几个CLI守护进程使用PHP+Zend框架。 它们占用了相当多的内存。我假设Zend框架部分可能是造成这种情况的原因,但我想让事实告诉我内存浪费在哪里 如何确定内存在何处被浪费?这只是一个试错过程吗? 还有,我如何改进垃圾收集(我读了一些文章,认为这可能也是导致大内存使用的一个问题)。我建议使用的profiler,它将为您提供所需的答案 探查器将生成一个cachegrind文件,您可以在诸如KCacheGrind之类的工具中查看该文件,以查看程序的瓶颈和内存使用情况 在XDebug的pr

我正在为几个CLI守护进程使用PHP+Zend框架。 它们占用了相当多的内存。我假设Zend框架部分可能是造成这种情况的原因,但我想让事实告诉我内存浪费在哪里

如何确定内存在何处被浪费?这只是一个试错过程吗? 还有,我如何改进垃圾收集(我读了一些文章,认为这可能也是导致大内存使用的一个问题)。

我建议使用的profiler,它将为您提供所需的答案

探查器将生成一个cachegrind文件,您可以在诸如KCacheGrind之类的工具中查看该文件,以查看程序的瓶颈和内存使用情况


在XDebug的profiler页面上了解更多信息:

您正在运行什么版本的PHP?只有PHP>=5.3有一个像样的垃圾收集器。PHPIME,PHP使用大量内存来解析代码-尝试构建一个简单的脚本,它除了显式地包含您正在使用的所有lib之外什么都不做,并在开始/结束时跟踪内存使用情况。将此与您在实际脚本中看到的内容进行比较

Htbaa部分是正确的-较新版本的PHP有一个更智能的垃圾收集器,但是早期版本仍然进行垃圾收集-他们只是没有找到较新的gc所做的所有情况。但由于它的垃圾收集,在给定稳定的输入负载的情况下,您通常会看到内存使用率呈锯齿状


但是好的垃圾收集并不能修复坏代码——如果你在一个不在堆栈上的变量中存储了一些东西,那么你需要在处理完它后将其取消设置。

看看这个问题:据我所知,分析器只分析所花费的时间,而不是内存消耗?@Sebastian Hoitz,-it(xdebug)不一定可以跟踪内存消耗—仅当孤岛引用出现问题时(对象对此特别糟糕—但数组也有同样的问题)。5.3仅添加“循环引用检测器”。GC的其余部分是相同的,根据我的经验,让PHP5.2守护进程占用所有内存并不需要太多。我的案例只是一个基于Zend_队列的简单工作人员。即使退回到排除对象并在循环时运行空的
,它也会不断消耗内存,直到达到
内存限制
并且守护进程自行终止。PHP5.3解决了这些问题。遗憾的是,生产服务器上还没有PHP5.3:-)。