2013-02-22 132 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