2012-03-02 63 views
1

我想知道是否有人能回答我這個簡短的問題。我嘗試搜索它,但我得到類似的問題,但在錯誤的背景下。PHP函數變量和垃圾回收器

我想知道的是採取這樣的代碼:

function foo() 
{ 
    $test_array = array(); 
    for($i=0; $i<10000000; $i++) 
    { 
     $test_array[] = $i; 
    } 
} 

功能完成後會發生到$ test_array什麼。我知道它失去了範圍,我對編程並不陌生。

什麼我不知道是應該我叫

unset($test_array); 

函數結束或函數結束時沒有PHP將其設置爲刪除垃圾收集過嗎?

我使用for循環只是爲了顯示一個公平的大小變量來獲得我的觀點。

感謝您閱讀 凱文

回答

3

一旦$ test_array不再範圍(也有指向它不需要額外的引用),它被標記爲垃圾回收。當進程從函數返回到調用例程時,它停止在範圍內。所以沒有必要解除它。如果你聲明$ test_array爲靜態,這隻會是不同的

+0

在我自己用'memory_get_usage()'測試(可能非常特定於平臺的情況下,用一點鹽) - 顯式取消設置變量似乎可以立即釋放內存。讓變量超出範圍肯定會標記變量可用於收集,但不一定會觸發收集器本身。 – gregheo 2012-03-02 21:17:28

+0

unset()不會刪除,它只會標記爲刪除...並且垃圾收集不會由unset()或返回到調用例程觸發。正如編碼器說的那樣,當CPU有空閒週期時,或者當PHP嘗試分配額外內存並且沒有足夠的需求時,就會發生這種情況。 – 2012-03-02 21:22:15

+0

據我所知,未設置不會調用垃圾回收器 – 2012-03-02 21:25:03

0

unset()不釋放變量使用的內存,它只是標記爲垃圾收集器,它將決定何時釋放內存(何時釋放內存免費的CPU週期或內存耗盡時,以先到者爲準)。

但是,您必須認識到,當腳本完成時,大部分時間以毫秒爲單位測量,PHP腳本使用的所有內存都將被釋放,因此如果您沒有執行任何超出「正常「的PHP腳本執行時間,你不應該擔心釋放內存。

+0

我知道內存在腳本執行後被釋放,但是當涉及到乾淨的託管代碼時,我有點肛門。 – 2012-03-02 21:25:51