4

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

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

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

然后,每个新循环都会发生内存使用量翻倍的情况。

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

$fu = $f['单位']

$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(旧...)

4

1 回答 1

3

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

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

两者都会消耗内存。

在使用它之前检查变量是否存在总是一个好习惯。始终在您的开发系统中启用 E_NOTICE 错误以查看任何此类问题。

于 2013-04-18T08:13:16.843 回答