2013-02-22 79 views
1

我有一个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 

任何想法,其中内存泄漏可能是什么?以及我如何避免它?

+0

作为一个WAG,我想''while'循环是责任。可能与'fgets'有关。作为妻子和女朋友的 – zzzzBov 2013-02-22 18:20:04

+0

? http://en.wikipedia.org/wiki/WAGs – 75inchpianist 2013-02-22 18:22:57

+0

Apache访问日志可能会变得非常大,你试图解析的文件有多大? – 2013-02-22 18:23:00

回答

0

默认情况下,PHP不会执行垃圾回收(从手册中可以看出)。有几件事你可以做。

1)使用gc_enable()启用GC。您可以使用gc_collect_cycles()强制进行GC通过。

2)使用unset($line)明确销毁$line

+0

我刚刚意识到这可能无法解决您的问题。另一个尝试是使用'TRUE'参数调用'memory_get_usage'来获取操作系统的使用情况,而不是PHP的内部计数器。他们的分配器中可能有一个错误。 – slugonamission 2013-02-22 18:55:40

+0

很好的建议,但都没有帮助。通过TRUE并没有区别...相反,它报告的内存量稍有不同,但每次迭代都是相同的。 – pocketfullofcheese 2013-02-22 18:58:54

+0

你没有得到一个不同的措施吗?你如何从操作系统获取内存大小? – slugonamission 2013-02-22 18:59:26