2010-08-06 70 views
8

從C/C++背景的,我習慣了做我自己的垃圾收集 - 即使用後釋放資源(即C++土地RAII)。中調用未設置()在PHP腳本

我發現自己你重置(主要是ORM)變量使用後。這種習慣有什麼好處嗎?

我remeber讀書的地方而回,那解封變量標記爲刪除了PHP的GC的關注 - 它可以幫助在服務器端資源使用 - 真的還是假的?

[編輯]

我忘了提,我使用PHP 5.3,也是最未固化的()調用我做在一個循環,我在處理一些「重」 ORM變量

回答

3

我建議給this

3

如果一個非常大的物體在很長的腳本早期使用,並且也沒有機會爲對象走出去的範圍,然後unset()可以幫助內存使用。在大多數情況下,物體超出了範圍,並且它們被自動標記爲GC。

0

是的,尤其是當您處理大數組時,腳本需要大量時間才能運行。

0

無需查找一些證據,我會說它並不重要。垃圾收集在您離開函數或腳本結束時自動發生。所以除非你是真的捆綁資源,不要打擾。

好的,看起來有點。這裏是一個很好的報價:

「釋放內存 - 尤其是大型 量 - 不自由的 處理器時間,這意味着如果 你希望你的腳本執行速度 儘可能在條件的 RAM的費用,應避免垃圾收集 大的變量,而 它的運行,然後讓PHP去做EN 集體在腳本的結束。」

有關主題的更多信息檢查出the first answer here.

0
  • 我認爲PHP變量只能通過腳本的壽命保留提供的鏈接,所以它不太可能有幫助那麼多,除非你的腳本特別是長時間運行或一步使用大量臨時內存。
  • 明確清除可能比讓它們在啓動時自動清除要慢。
  • 您正在添加更多的代碼,除非您知道它有幫助,否則通常會讓事情變得更慢。
  • 不管怎樣,過早優化。
0

PHP GC通常足夠好,所以你通常不需要在簡單變量上調用unset()。然而,對於對象,GC只會在他們離開作用域時銷燬它們,而其他對象不會引用它們。在這種情況下,Unset可以幫助記憶。見http://us3.php.net/manual/en/language.references.unset.php

5

我發現,如果不得不使用unset你很多你可能做錯。讓我們爲你做出「不安定」的範圍。考慮兩個例子:

1:

$var1 = f(...); 
.... 
unset($var1); 

$var2 = g(...); 
.... 
unset($var2); 

2:

function scope1() 
{ 
    $var1 = f(...); 
    .... 
} //end of function triggers release of $var1 

function scope2() 
{ 
    $var2 = g(...); 
    .... 
} //end of function triggers release of $var2 

scope1(); 
scope2(); 

第二個例子我將是優選的,因爲它清楚地定義的範圍和降低泄漏的變量來全局範圍的風險(只在腳本結尾處發佈)。

編輯:

要牢記的另一個事情是在PHP中unset花費更多(CPU)比正常範圍的垃圾收集。雖然差異很小,但它展示了PHP團隊對unset的重視程度。如果有什麼東西給PHP提供有關如何釋放內存的見解,但它實際上增加了執行時間。 unset真的只有釋放那些不再需要的變量,除非你做一些相當複雜的黑客攻擊,重用變量(就像在舊可變自然unset)和範圍應該是所有你曾經需要

function noop($value){} 

function test1() 
{ 
    $value = "something"; 
    noop($value); //make sure $value isn't optimized out 
} 

function test2() 
{ 
    $value = "something"; 
    noop($value); //make sure $value isn't optimized out 
    unset($value); 
} 

$start1 = microtime(true); 
for($i = 0; $i < 1000000; $i++) test1(); 
$end1 = microtime(true); 

$start2 = microtime(true); 
for($i = 0; $i < 1000000; $i++) test2(); 
$end2 = microtime(true); 

echo "test1 ".($end1 - $start1)."\n"; //test1 0.404934883118 
echo "test2 ".($end2 - $start2)."\n"; //test2 0.434437990189 
0

我不得不在使用循環和製作數組副本時遇到內存問題時使用未設置。我會說不要使用它,除非你在這種情況下,GC會自動啓動。