PHP未设置会导致内存耗尽

时间:2018-12-15 21:29:42

标签: php memory unset

在我的脚本中,我想清除数组元素以释放不再使用的数据中的内存。

我发现自己处于一种奇怪的情况,使用 unset() 会导致以下情况:

  

(!)致命错误:耗尽的134217728字节允许的内存大小   (尝试分配16777224字节)在   ... / models / Persons.php,第60行

这是导致此问题的代码部分:

$chunks_count = count($this->xml_records_chunk['fnames']) - 1;
for ($num = 0; $num <= $chunks_count; $num++) {
      $chunks_count = count($this->xml_records_chunk['fnames']) - 1;

       $not_last = ($num < $chunks_count ? ',' : '');

       $new_records .= '(' . $this->xml_records_chunk['fnames'][$chunks_count] . ','
        . $this->xml_records_chunk['lnames'][$chunks_count] . ' , '
        . $this->xml_records_chunk['dobs'][$chunks_count] . ' , '
        . $this->xml_records_chunk['phones'][$chunks_count] . ' )' . $not_last;
       unset($this->xml_records_chunk['fnames'][$chunks_count]);
       unset($this->xml_records_chunk['lnames'][$chunks_count]);
       unset($this->xml_records_chunk['dobs'][$chunks_count]);
       unset($this->xml_records_chunk['phones'][$chunks_count]);
}

脚本可以正常工作而不会被重置。

现在的问题是:

  • 为什么未设置会导致内存耗尽?
  • 在这种情况下取​​消设置未使用的数组元素的正确方法是什么?

我已经检查了这个例子,

好吧,null确实可以以其他方式工作,因为脚本死于第61行-未设置第3行。

1 个答案:

答案 0 :(得分:0)

这是一个很好的问题,为什么您的病情困扰着您的记忆。但是您将$this->xml_records_chunk称为代码中的变量。因此,我建议您使用一个包含所有现有元素的数组,以便您已经分配了完整的内存。

我认为在那种情况下,您不需要清理阵列和内存,因为您已经分配了该内存。 GC还不错。因此,如果脚本不再使用该变量,则会对其进行清理。

在您的情况下,我建议您更改数组结构,并将迭代器放在值的第一个条目中,如下所示:

$this->xml_records_chunk[$chunks_count]['phones']

那么您将具有以下结构

$this->xml_records_chunk[$chunks_count] = [
    'phones',
    '...',
    '...
]

然后您可以使用

取消设置一个完整的数组来进行清洁

unset($this->xml_records_chunk[$chunks_count])

这可以减少问题的发生,也许您可​​以检查Iterator-Interface来迭代和删除数据。