我有一个分析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(旧...)
答案 0 :(得分:3)
您的问题可能来自PHP错误处理程序,而不是来自您的实际循环。
就像你说的那样,并不是每个“单元”键都存在,因此会出现错误(或异常,具体取决于你的错误处理程序)。这可能还包括堆栈跟踪和进一步的调试信息,具体取决于您安装的扩展名(xdebug?)。
两者都会消耗内存。
在使用变量之前检查变量是一种很好的做法。 Allways在您的开发系统中启用了E_NOTICE错误,以查看任何此类问题。