我有一個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
任何想法,其中內存泄漏可能是什麼?以及我如何避免它?
作爲一個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