我有一个运行无限长(无限主事件循环)处理来自Twitter的鸣叫传入的流,并将其存储到MySQL的PHP脚本。但是,我似乎无法控制其内存使用情况。我发现3种方式来衡量内存使用:解决PHP内存泄漏
memory_get_usage()
- 约4.0 MBmemory_get_usage(true)
报告 - 报告约7.5 MBexec("ps -o rss -p " . getmypid(), $memOutput);
- 报告线性增加的数量快速增长到数百MB在60分钟或更短的时间内,并继续吞噬内存,直到脚本被强行终止。
我的问题:
1)什么是这三个措施之间的实际差别?
但主要是:
2)什么意思,如果前两个是相对恒定的,但第三个方法是疯狂了这样的控制?
FWIW,我使用PHP 5.3与Zend框架1.x和很多Zend_Db的活动。脚本在CLI SAPI下运行。 Zend_Db_Profiler没有被使用。我还有第二个无限制运行的脚本,它根本不使用数据库,并且内存使用情况不变。因此,它似乎是与数据库相关的,也许是MySQL扩展我的PHP安装使用,也可能Zend_Db的。我已经在我自己的代码中不厌其烦地避免不小心缓存的对象,虽然我还没有与Zend的代码本身做到了这一点。
我试过让脚本调用gc_enable()
,并定期运行gc_collect_cycles()
,但这没有帮助。
任何想法?
编辑我打算只要我可以分析这个代码,但同时我也注意到,即使我的脚本不碰DB也被泄漏内存。但是他们的速度要慢得多,只有在几天的时间内比较内存使用情况才会显现出来。
在不需要对象之后,为了回收内存,您已经采取了哪些步骤? –
首先,我通过使用数组来瞬间存储数据,从而避免使用对象。但关于对象(比如Zend_Db返回的表行),我没有做任何特殊的事情来回收它们的内存。我的理解是,当它们超出范围(即方法结束时),并且不再引用这些对象时,它们便有资格通过PHP的垃圾回收进行回收。我不保留任何引用。但我意识到Zend_Db可能是。 – curtisdf