访问未定义的数组索引导致内存泄漏

时间:2013-04-02 15:38:52

标签: php arrays memory

我有一个分析XML数据并用信息填充相同数组的脚本。

对于某些(巨大的)输入,脚本崩溃了。

有一个foreach循环,运行180次没有问题(memory_get_usage()在迭代180大约20 MB,每个循环增加大约0.1 MB)

然后它发生在每个新循环中,内存使用量只增加一倍。

通过使用大量日志记录,我能够将问题跟踪到foreach中的以下行。

$ fu = $ f ['unit']

$f具有以下结构:

array (
  'name' => 'Test',
  'value' => '4',
  'unit' => 'min-1',
)

但在某些(很多)情况下(但也在第180次迭代之前),数组中不存在键unit

我可以通过用以下代码替换行来消除这个问题:

$fu = (isset($f['unit']) ? $f['unit'] : '');

然后迭代运行直到完成(总共370次迭代)。

这种现象有什么解释吗?

PHP版本:带有Suhosin-Patch的PHP 5.3.3-1ubuntu9.10(旧...)

1 个答案:

答案 0 :(得分:3)

您的问题可能来自PHP错误处理程序,而不是来自您的实际循环。

就像你说的那样,并不是每个“单元”键都存在,因此会出现错误(或异常,具体取决于你的错误处理程序)。这可能还包括堆栈跟踪和进一步的调试信息,具体取决于您安装的扩展名(xdebug?)。

两者都会消耗内存。

在使用变量之前检查变量是一种很好的做法。 Allways在您的开发系统中启用了E_NOTICE错误,以查看任何此类问题。