我有一个PHP脚本无限期地运行(无限主事件循环)处理来自Twitter的传入推文流并将它们存储到MySQL.但是,我似乎无法控制其内存使用量.我找到了3种测量内存使用量的方法:
> memory_get_usage() – 报告大约4.0 MB
> memory_get_usage(true) – 报告大约7.5 MB
> exec(“ps -o rss -p”.getmypid(),$memOutput); – 报告线性增加的数字,在60分钟或更短的时间内快速增长到数百MB,并继续占用内存,直到脚本被强制终止.
我的问题:
1)这三项措施之间的实际区别是什么?
但主要是:
2)如果前两个相对恒定,这意味着什么,但第三种方法是如此严重失控?
FWIW,我正在使用PHP 5.3和Zend Framework 1.x以及很多Zend_Db活动.脚本在CLI SAPI下运行. Zend_Db_Profiler未被使用.我还有第二个无限运行的脚本,根本不使用数据库,内存使用量是不变的.所以它似乎与数据库相关,也许是我的PHP设置正在使用的MySQL扩展,或者Zend_Db.我在自己的代码中花了很大的力气,以避免不小心缓存对象,虽然我没有用Zend的代码本身做到这一点.
我已经尝试让我的脚本调用gc_enable(),并定期运行gc_collect_cycles(),但这没有帮助.
有任何想法吗?
编辑我打算尽快剖析这段代码,但同时我注意到即使我的脚本没有触及数据库,也会泄漏内存.但是他们以更慢的速度这样做,只有在比较几天的内存使用情况时才会变得明显.
解决方法:
好吧,我不能指出你在这里的确切答案,因为你需要自己进行分析.根据你的说法,它似乎指向Zend的数据库层,但除非你对此进行分析,否则你无法确定.
标签:php,mysql,memory-leaks,zend-framework
来源: https://codeday.me/bug/20190703/1368222.html