我有一个PHP脚本,它无限期地运行(无限主事件循环),处理来自Twitter的流入推文并将它们存储到MySQL中。然而,我似乎无法控制它的内存使用情况。我发现了三种测量内存使用情况的方法:
1. `memory_get_usage()` - 报告约为4.0 MB 2. `memory_get_usage(true)` - 报告约为7.5 MB 3. `exec("ps -o rss -p " . getmypid(), $memOutput);` - 报告一个线性增长的数字,在60分钟内迅速增长到数百MB,并继续消耗内存,直到脚本被强制终止。
我的问题是:
1. 这三种测量方法之间的实际区别是什么? 2. 如果前两种方法相对稳定,但第三种方法像这样失控,这意味着什么?
值得一提的是,我正在使用带有Zend Framework 1.x和许多Zend_Db活动的PHP 5.3。脚本在CLI SAPI下运行。没有使用Zend_Db_Profiler。我还有一个完全不使用数据库的第二个无限运行脚本,内存使用保持不变。因此,它似乎与数据库相关,可能是我PHP设置中使用的MySQL扩展,或者可能是Zend_Db。我在自己的代码中非常小心地避免了粗心缓存对象,尽管我没有对Zend的代码本身这样做。
我尝试让我的脚本调用`gc_enable()`,并定期运行`gc_collect_cycles()`,但这没有帮助。
有什么想法吗?
编辑:我打算尽快对这段代码进行分析,但与此同时,我注意到即使是不涉及数据库的脚本也会泄漏内存。但是它们的速度要慢得多,只有在比较几天的内存使用情况时才变得明显。
1. `memory_get_usage()` - 报告约为4.0 MB 2. `memory_get_usage(true)` - 报告约为7.5 MB 3. `exec("ps -o rss -p " . getmypid(), $memOutput);` - 报告一个线性增长的数字,在60分钟内迅速增长到数百MB,并继续消耗内存,直到脚本被强制终止。
我的问题是:
1. 这三种测量方法之间的实际区别是什么? 2. 如果前两种方法相对稳定,但第三种方法像这样失控,这意味着什么?
值得一提的是,我正在使用带有Zend Framework 1.x和许多Zend_Db活动的PHP 5.3。脚本在CLI SAPI下运行。没有使用Zend_Db_Profiler。我还有一个完全不使用数据库的第二个无限运行脚本,内存使用保持不变。因此,它似乎与数据库相关,可能是我PHP设置中使用的MySQL扩展,或者可能是Zend_Db。我在自己的代码中非常小心地避免了粗心缓存对象,尽管我没有对Zend的代码本身这样做。
我尝试让我的脚本调用`gc_enable()`,并定期运行`gc_collect_cycles()`,但这没有帮助。
有什么想法吗?
编辑:我打算尽快对这段代码进行分析,但与此同时,我注意到即使是不涉及数据库的脚本也会泄漏内存。但是它们的速度要慢得多,只有在比较几天的内存使用情况时才变得明显。