【发布时间】:2013-02-08 10:49:40
【问题描述】:
我有一个 PHP 代码 sn-p 读取 apache 访问日志进行处理。我已将代码精简到这几行,但仍然发现泄漏。 PHP 进程不断占用越来越多的内存,尽管 echo memory_get_usage() 每次都报告 11Mb。
在 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:添加了 VM 大小
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有关。 -
作为妻子和女朋友? en.wikipedia.org/wiki/WAGs
-
Apache 访问日志可能会变得非常大,您尝试解析的日志有多大?
-
@mike 这与 fgets 无关。你试过另一个php版本吗?
-
你提到你的同事和 Crozin 一样没有问题,他们测试了哪些 PHP 版本?如果您认为不是 PHP 版本问题,您可以尝试使用 SplFile api:php.net/manual/en/spl.files.php
标签: php memory-leaks