2010-04-11 26 views
29

我對PHP有點新,我想知道:在PHP中取消設置變量有多重要?我知道像C這樣的語言,我們釋放分配的內存以防止泄漏等。通過在使用變量時使用未設置的變量,這將顯着提高我的應用程序的性能嗎?在PHP中取消設置變量有多重要?

還有一個比較使用未設置和未使用未設置的區別的基準嗎?

+0

*(相關)* http://www.php.net/manual/en/features.gc.refcounting-basics.php和http://blog.preinheimer.com/index.php?/歸檔/ 354-Memory-usage-in-PHP.html – Gordon 2010-04-11 16:17:47

+0

感謝您的鏈接。他們給出了很好的解釋。 – dd0x 2010-04-11 16:29:12

回答

49

this example(和article我聯繫的問題如下圖):

$x = str_repeat('x', 80000); 
echo memory_get_usage() . "<br>\n";  // 120172 
echo memory_get_peak_usage() . "<br>\n"; // 121248 

$x = str_repeat('x', 80000); 
echo memory_get_usage() . "<br>\n";  // 120172 
echo memory_get_peak_usage() . "<br>\n"; // 201284 

正如你所看到的,在一個點PHP已經用完了幾乎雙倍的內存。這是因爲在將'x'字符串分配給$x之前,PHP在內存中構建新的字符串,同時也將前一個變量保存在內存中。這可以通過unset$x來防止。

又如:

for ($i=0; $i<3; $i++) { 
    $str = str_repeat("Hello", 10000); 
    echo memory_get_peak_usage(), PHP_EOL; 
} 

這將輸出類似

375696 
425824 
425824 

在第一次迭代$str仍然是分配前空。在第二次迭代中,$str將保留生成的字符串。當第二次調用str_repeat時,它不會立即覆蓋$str,但首先會創建要在內存中分配的字符串。所以你最終得到$str和它應該分配的值。雙重記憶。如果您未設置$str,則不會發生這種情況:

for($i=0;$i<3;$i++) { 
    $str = str_repeat("Hello", 10000); 
    echo memory_get_peak_usage(), PHP_EOL; 
    unset($str); 
} 

// outputs something like 
375904 
376016 
376016 

重要嗎?那麼,鏈接的文章總結它相當不錯

這不是關鍵,除非它是。

當你不再需要變量時,不會影響變量的設置。也許你在一個共享主機上,想要對大數據集進行迭代。如果未設置將阻止PHP以結束允許的內存大小XXXX字節耗盡,那麼這是值得的小小的努力。

還應該考慮的是,即使請求生存期僅僅是一秒,內存使用量翻了一番,有效地減半了可以服務的同時請求的最大數量。如果你無論如何都無法接近服務器的限制,那麼誰在乎,但如果你是這樣,那麼一個簡單的未設置可以爲你節省更多的RAM或額外的服務器。

+0

在當前的項目中,我使用PHP通過移動循環來生成大量可變大小的HTML頁面,所以我應該在每個循環結束時清除保存內容的變量。這可能是「關鍵」正確的? – dd0x 2010-04-11 17:22:48

+0

@ dd0x理論上,是的。但實際上,您應該使用XDebug之類的功能來分析您的應用程序,以確定它是否非常重要。我認爲在PHP中更多地使用縮放優化而非絕對必要。 – Gordon 2010-04-11 17:31:20

+0

@ dd0x只需添加一下,PHP就有一個垃圾收集器,可以確保99.9%的時間不必擔心。 – Yacoby 2010-04-11 21:11:03

3

用C語言編寫的應用程序通常運行數小時。但通常的PHP應用程序的運行時間僅爲0.05秒。所以,使用未設置就不那麼重要了。

+5

雖然它可能是真的,但它不是正確的答案。我已經運行腳本PHP數天了。由於PHP是垃圾收集,腳本運行的時間大部分是不相關的。 – Yacoby 2010-04-11 17:05:28

+2

答案也給人一種印象,即在長時間運行的腳本中需要「unset」,而「unset」與「free」等價。 – Yacoby 2010-04-11 17:11:59

+0

@Yacoby「*我已經運行腳本PHP的天*」也許你需要看看使用別的東西來完成這樣的特定任務。 PHP更適合於Web應用程序,並且網頁無需運行數日。當然,現在5年的網絡服務器功能要強大得多(甚至每月3英鎊的廉價主機),PHP垃圾收集功能也得到了改進。不建議取消設置釋放資源的變量。 – James 2015-06-26 13:48:22

7

在許多情況下,unset不會實際釋放大部分內容,所以它的使用通常是毫無意義的,除非您的代碼的邏輯流程需要它的不存在。

+3

也應該說所有的內存都在腳本執行結束時被釋放,所以在執行結束之前取消設置對性能沒有什麼好處(甚至可能是有害的)。 – mattbasta 2010-04-11 16:38:10

0

這取決於你應該確保你的網頁很長(例如從db中選擇的博客文章的內容)。

<?php 
$post = get_blog_post(); 
echo $post; 
unset($post); 
?>