PHP未设置会导致内存耗尽



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

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

(!(致命错误:允许的内存大小134217728字节已用完(尝试分配16777224字节(…/型号/Personas.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]);
}

脚本在没有取消设置的情况下运行良好。

现在的问题是:

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

我已经检查过了,例如:

  • 什么';s更擅长用PHP释放内存:unset((或$var=null

Ok null确实以另一种方式工作,因为脚本在第61行-第3行未设置。

这是一个很好的问题,为什么你的unset会破坏你的内存。但是您在代码中调用$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接口来迭代和删除数据。

最新更新