Php 访问未定义的数组索引导致内存泄漏
我有一个脚本,它分析XML数据并用信息填充相同的数组 对于一些(巨大的)输入,脚本崩溃了 有一个foreach循环,可以运行大约180次而没有问题(在180次迭代中,内存使用量大约为20MB,每个循环增加大约0.1MB) 然后,每一个新循环的内存使用量都会翻一番 通过使用大量日志记录,我能够在foreach中跟踪问题,直到下一行 $fu=$f[‘单位’]Php 访问未定义的数组索引导致内存泄漏,php,arrays,memory,Php,Arrays,Memory,我有一个脚本,它分析XML数据并用信息填充相同的数组 对于一些(巨大的)输入,脚本崩溃了 有一个foreach循环,可以运行大约180次而没有问题(在180次迭代中,内存使用量大约为20MB,每个循环增加大约0.1MB) 然后,每一个新循环的内存使用量都会翻一番 通过使用大量日志记录,我能够在foreach中跟踪问题,直到下一行 $fu=$f[‘单位’] $f具有以下结构: array ( 'name' => 'Test', 'value' => '4', 'unit'
$f
具有以下结构:
array (
'name' => 'Test',
'value' => '4',
'unit' => 'min-1',
)
但在某些(许多)情况下(也是在第180次迭代之前),数组中不存在键单元
我通过将线路更换为:
$fu = (isset($f['unit']) ? $f['unit'] : '');
然后迭代运行直到完成(总共370次迭代)
这些现象有什么解释吗
PHP版本:PHP5.3.3-1ubuntu9.10和Suhosin补丁(旧…您的问题可能来自PHP错误处理程序,而不是实际的循环 正如您所说,并非每个“单元”键都存在,因此会引发错误(或异常,具体取决于错误处理程序)。这还可能包括堆栈跟踪和进一步的调试信息,具体取决于您安装的扩展(xdebug?) 两者都将消耗内存
在使用之前检查变量是否存在始终是一个好的做法。所有方法都可以让E_NOTICE在您的开发系统中看到任何此类问题。您使用的是什么版本的PHP?如果您在支持的PHP版本中发现内存泄漏,那么您应该在PHP错误跟踪程序中报告。但是,您使用
isset()
的解决方案是正确的——这被认为是访问在任何情况下都可能不存在的数组元素时的最佳做法。@Spudley:edited-我只是想确定这是否是已知的。