这个PHP代码片段中的内存泄漏在哪里?
我有一个PHP代码片段,读取apache访问日志进行处理。我已经将代码剥离到了这几行,但仍然发现泄漏。尽管echo memory_get_usage()每次都会报告11Mb,但PHP进程会占用越来越多的内存。这个PHP代码片段中的内存泄漏在哪里?
在Ubuntu 12机器上使用PHP 5.3.6运行。 Ubuntu上的问题会消失在PHP 5.2上。
$logDir = opendir(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'tempLog');
while (($file = readdir($logDir)) !== false) {
echo($file . PHP_EOL);
$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'tempLog' . DIRECTORY_SEPARATOR . $file;
$fhandle = fopen($filePath, 'r');
fseek($fhandle, 0);
while(!feof($fhandle)) {
$line = fgets($fhandle);
}
fclose($fhandle);
echo('Finished reading!' . PHP_EOL);
echo('Memory usage: ' . memory_get_usage() . PHP_EOL . PHP_EOL);
system('cat /proc/' . getmypid() . '/status | grep VmSize');
}
编辑:从这个脚本添加输出样本: EDIT2:增加虚拟内存大小
access.log.2
Finished reading!
Memory usage: 11303616
VmSize: 54972 kB
access.log.19
Finished reading!
Memory usage: 11303616
VmSize: 55896 kB
access.log.23
Finished reading!
Memory usage: 11303616
VmSize: 81372 kB
access.log.41
Finished reading!
Memory usage: 11303616
VmSize: 93120 kB
access.log.31
Finished reading!
Memory usage: 11303616
VmSize: 107508 kB
access.log.28
Finished reading!
Memory usage: 11303616
VmSize: 112128 kB
access.log.5
Finished reading!
Memory usage: 11303616
VmSize: 112920 kB
..
Finished reading!
Memory usage: 11303592
VmSize: 112920 kB
.
Finished reading!
Memory usage: 11303592
VmSize: 112920 kB
任何想法,其中内存泄漏可能是什么?以及我如何避免它?
默认情况下,PHP不会执行垃圾回收(从手册中可以看出)。有几件事你可以做。
1)使用gc_enable()
启用GC。您可以使用gc_collect_cycles()
强制进行GC通过。
2)使用unset($line)
明确销毁$line
。
我刚刚意识到这可能无法解决您的问题。另一个尝试是使用'TRUE'参数调用'memory_get_usage'来获取操作系统的使用情况,而不是PHP的内部计数器。他们的分配器中可能有一个错误。 – slugonamission 2013-02-22 18:55:40
很好的建议,但都没有帮助。通过TRUE并没有区别...相反,它报告的内存量稍有不同,但每次迭代都是相同的。 – pocketfullofcheese 2013-02-22 18:58:54
你没有得到一个不同的措施吗?你如何从操作系统获取内存大小? – slugonamission 2013-02-22 18:59:26
作为一个WAG,我想''while'循环是责任。可能与'fgets'有关。作为妻子和女朋友的 – zzzzBov 2013-02-22 18:20:04
? http://en.wikipedia.org/wiki/WAGs – 75inchpianist 2013-02-22 18:22:57
Apache访问日志可能会变得非常大,你试图解析的文件有多大? – 2013-02-22 18:23:00