我正在为几个 CLI 守护程序使用 PHP + Zend 框架。它们占用了相当多的内存。我假设 Zend Framework 部分可能会导致这种情况,但我希望有事实告诉我内存浪费在哪里。
如何确定内存浪费在哪里?这只是一个试错过程吗?另外,如何改进垃圾收集(我读了一些文章,这也可能是导致大量内存使用的问题)。
我正在为几个 CLI 守护程序使用 PHP + Zend 框架。它们占用了相当多的内存。我假设 Zend Framework 部分可能会导致这种情况,但我希望有事实告诉我内存浪费在哪里。
如何确定内存浪费在哪里?这只是一个试错过程吗?另外,如何改进垃圾收集(我读了一些文章,这也可能是导致大量内存使用的问题)。
我建议使用XDebug的分析器,它应该可以为您提供所需的答案。
分析器将生成一个 cachegrind 文件,您可以在 KCacheGrind 等工具中查看该文件,以了解程序的瓶颈和内存使用情况。
在 XDebug 的分析器页面上了解更多信息:http ://www.xdebug.org/docs/profiler
IME,PHP 使用大量内存来解析代码 - 尝试构建一个简单的脚本,该脚本除了显式包含您正在使用的所有库并在开始/结束时跟踪内存使用情况之外什么都不做。将此与您在实际脚本中看到的内容进行比较。
Htbaa 部分正确 - 较新版本的 PHP 具有更智能的垃圾收集器,但早期版本仍然进行垃圾收集 - 他们只是找不到较新 gc 所做的所有情况。但是由于它的垃圾收集,在稳定的输入负载下,您通常会在内存使用中看到一些锯齿。
但是好的垃圾回收不会修复错误的代码——如果你在一个不在堆栈上的变量中存储了一些东西,那么当你完成它时你需要取消设置它。
你运行的是什么版本的PHP?只有 PHP >=5.3 有一个不错的垃圾收集器。当用于运行守护程序脚本时,PHP <=5.2 会吃掉你所有的内存。