從C/C++背景的,我習慣了做我自己的垃圾收集 - 即使用後釋放資源(即C++土地RAII)。中調用未設置()在PHP腳本
我發現自己你重置(主要是ORM)變量使用後。這種習慣有什麼好處嗎?
我remeber讀書的地方而回,那解封變量標記爲刪除了PHP的GC的關注 - 它可以幫助在服務器端資源使用 - 真的還是假的?
[編輯]
我忘了提,我使用PHP 5.3,也是最未固化的()調用我做在一個循環,我在處理一些「重」 ORM變量
從C/C++背景的,我習慣了做我自己的垃圾收集 - 即使用後釋放資源(即C++土地RAII)。中調用未設置()在PHP腳本
我發現自己你重置(主要是ORM)變量使用後。這種習慣有什麼好處嗎?
我remeber讀書的地方而回,那解封變量標記爲刪除了PHP的GC的關注 - 它可以幫助在服務器端資源使用 - 真的還是假的?
[編輯]
我忘了提,我使用PHP 5.3,也是最未固化的()調用我做在一個循環,我在處理一些「重」 ORM變量
我建議給this讀
如果一個非常大的物體在很長的腳本早期使用,並且也沒有機會爲對象走出去的範圍,然後unset()
可以幫助內存使用。在大多數情況下,物體超出了範圍,並且它們被自動標記爲GC。
是的,尤其是當您處理大數組時,腳本需要大量時間才能運行。
無需查找一些證據,我會說它並不重要。垃圾收集在您離開函數或腳本結束時自動發生。所以除非你是真的捆綁資源,不要打擾。
好的,看起來有點。這裏是一個很好的報價:
「釋放內存 - 尤其是大型 量 - 不自由的 處理器時間,這意味着如果 你希望你的腳本執行速度 儘可能在條件的 RAM的費用,應避免垃圾收集 大的變量,而 它的運行,然後讓PHP去做EN 集體在腳本的結束。」
有關主題的更多信息檢查出the first answer here.
PHP GC通常足夠好,所以你通常不需要在簡單變量上調用unset()。然而,對於對象,GC只會在他們離開作用域時銷燬它們,而其他對象不會引用它們。在這種情況下,Unset可以幫助記憶。見http://us3.php.net/manual/en/language.references.unset.php
我發現,如果不得不使用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
我不得不在使用循環和製作數組副本時遇到內存問題時使用未設置。我會說不要使用它,除非你在這種情況下,GC會自動啓動。