PHP CLI - 检测我的内存浪费在哪里

Posted

技术标签:

【中文标题】PHP CLI - 检测我的内存浪费在哪里【英文标题】:PHP CLI - Detect where my memory is wasted 【发布时间】:2011-02-03 09:54:55 【问题描述】:

我正在为几个 CLI 守护程序使用 php + Zend 框架。 它们占用了相当多的内存。我假设 Zend 框架部分可能会导致这种情况,但我希望有事实告诉我内存浪费在哪里。

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

【问题讨论】:

看看这个问题:***.com/questions/4286193/… 【参考方案1】:

我建议使用XDebug 的分析器,它应该可以为您提供所需的答案。

分析器将生成一个 cachegrind 文件,您可以在 KCacheGrind 等工具中查看该文件,以了解程序的瓶颈和内存使用情况。

在 XDebug 的分析器页面上了解更多信息:http://www.xdebug.org/docs/profiler

【讨论】:

据我所知,分析器只分析所花费的时间,而不是内存消耗? @Sebastian Hoitz, xdebug.org/docs/execution_trace - 它(xdebug)也可以跟踪内存消耗【参考方案2】:

IME,PHP 使用大量内存来解析代码 - 尝试构建一个简单的脚本,该脚本除了显式包含您正在使用的所有库并在开始/结束时跟踪内存使用情况之外什么都不做。将此与您在实际脚本中看到的内容进行比较。

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

但是好的垃圾回收不会修复错误的代码——如果你在一个不在堆栈上的变量中存储了一些东西,那么你需要在完成后取消设置它。

【讨论】:

【参考方案3】:

您运行的是什么版本的 PHP?只有 PHP >=5.3 有一个不错的垃圾收集器。 PHP

【讨论】:

不一定 - 仅当您遇到孤立引用的问题时(对象对此特别不利 - 但数组也会遇到同样的问题)。 5.3 只添加了一个“圆形参考检测器”。 GC 的其余部分是相同的 根据我的经验,让 PHP 5.2 守护进程占用所有内存并不需要太多。我的案例只是一个基于 Zend_Queue 的简单工作人员。即使回退到排除对象并运行一个空的while 循环,它也会继续消耗内存,直到到达memory_limit 并且守护进程自行终止。在 PHP 5.3 中,这些问题都消失了。遗憾的是,生产服务器上还没有 PHP 5.3 :-)。

以上是关于PHP CLI - 检测我的内存浪费在哪里的主要内容,如果未能解决你的问题,请参考以下文章

如何通过php的curl模拟ajax请求,获取其返回值

Angular CLI 6:将库依赖项放在哪里

在 angular2 cli 中哪里可以找到 systemjs.config.js

我在 Ember-CLI 中将 Ember-I18n 的翻译放在哪里?

链表和数组的区别在哪里?

ember-cli 在哪里放置图像