2013-05-09 79 views
3

數組值上的垃圾回收是否像普通變量上的垃圾回收一樣工作?我應該取消設置我的PHP數組值嗎?

即將完整的$數組保存在內存中,直到每個數組鍵都沒有設置,或者整個數組不再有指向它的指針,如果PHP不再有引用它的數組密鑰,PHP會清除數組密鑰的內存嗎?

我想我問的是,PHP是否將數組作爲單個變量垃圾智慧或數組的實際部分進行處理。

有一個很難解釋我的問題,希望這是有道理的人:)

的原因,我的問題是,我將一個潛在的大結果從SQL設置成PHP對象的數組,然後過濾這個數組。我可能會根據我在這裏得到的答案改變我的過濾功能。

回答

2

是,如果你知道他們使用了大量的記憶,就像巨大的圖片,或大SQL查詢結果,但前提是你知道肯定是不需要的信息了,如果開始解封變量是個好主意你的PHP抱怨沒有足夠的內存。或者你的網絡服務器。在一塊尚未使用的內存中釋放一小部分內存是沒有用的。它不會被重用。重新排序記憶會吃掉表演。 PHP在處理變量時相當優化。

如果沒有其他引用指向該值,則取消設置變量將釋放其內存。對於一個數組也是如此:所有數組鍵都是對它們的值的引用,如果它們是唯一的,則取消設置數組本身將取消設置所有存儲的值。

您應該知道查詢結果完全存儲在內存中。你不能直接訪問它,但有一些功能,例如mysqli_result::data_seek(),它可以讓你指向你想要閱讀的條目,然後下一次撥打mysqli_result::fetch_assoc()就可以得到它。

如果您真的將結果複製到數組中,則至少會使內存消耗翻番,直到刪除查詢結果(顯式地調用mysqli_result::free()或通過取消設置結果對象)。

您可以但是也可以創建圍繞mysqli_result的包裝實現了ArrayAccess接口(也可能包括IteratorCountable)。這是你的數組 - 不需要複製。訪問隨機值將首先調用seek(),然後fetch_assoc(),並返回該值。

然後你就可以自由地使用所有的SPL類。想用foreach在運行時過濾結果嗎?實現你自己的FilterIterator,把你的結果包裝器放在裏面,然後你去。

相關問題