[英]PHP unset causes memory exhaustion
在我的腳本中,我想清除數組元素以釋放不再使用的數據中的內存。
我發現自己處於一種奇怪的情況下,使用unset()會導致:
(!)致命錯誤:在第60行的... / models / Persons.php中,耗盡了134217728字節的允許內存大小(試圖分配16777224字節)
這是導致此問題的代碼部分:
$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個未設置位置消失。
這是一個很好的問題,為什么您的不適會破壞您的記憶。 但是您在代碼$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來迭代和刪除數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.