我對PHP有點新,我想知道:在PHP中取消設置變量有多重要?我知道像C這樣的語言,我們釋放分配的內存以防止泄漏等。通過在使用變量時使用未設置的變量,這將顯着提高我的應用程序的性能嗎?在PHP中取消設置變量有多重要?
還有一個比較使用未設置和未使用未設置的區別的基準嗎?
我對PHP有點新,我想知道:在PHP中取消設置變量有多重要?我知道像C這樣的語言,我們釋放分配的內存以防止泄漏等。通過在使用變量時使用未設置的變量,這將顯着提高我的應用程序的性能嗎?在PHP中取消設置變量有多重要?
還有一個比較使用未設置和未使用未設置的區別的基準嗎?
見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或額外的服務器。
用C語言編寫的應用程序通常運行數小時。但通常的PHP應用程序的運行時間僅爲0.05秒。所以,使用未設置就不那麼重要了。
雖然它可能是真的,但它不是正確的答案。我已經運行腳本PHP數天了。由於PHP是垃圾收集,腳本運行的時間大部分是不相關的。 – Yacoby 2010-04-11 17:05:28
答案也給人一種印象,即在長時間運行的腳本中需要「unset」,而「unset」與「free」等價。 – Yacoby 2010-04-11 17:11:59
@Yacoby「*我已經運行腳本PHP的天*」也許你需要看看使用別的東西來完成這樣的特定任務。 PHP更適合於Web應用程序,並且網頁無需運行數日。當然,現在5年的網絡服務器功能要強大得多(甚至每月3英鎊的廉價主機),PHP垃圾收集功能也得到了改進。不建議取消設置釋放資源的變量。 – James 2015-06-26 13:48:22
在許多情況下,unset不會實際釋放大部分內容,所以它的使用通常是毫無意義的,除非您的代碼的邏輯流程需要它的不存在。
也應該說所有的內存都在腳本執行結束時被釋放,所以在執行結束之前取消設置對性能沒有什麼好處(甚至可能是有害的)。 – mattbasta 2010-04-11 16:38:10
這取決於你應該確保你的網頁很長(例如從db中選擇的博客文章的內容)。
<?php
$post = get_blog_post();
echo $post;
unset($post);
?>
*(相關)* 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
感謝您的鏈接。他們給出了很好的解釋。 – dd0x 2010-04-11 16:29:12