2012-06-20 20 views
2

開始之前,我並沒有提到標準的編碼習慣或「禮節」。我的問題更多的是來自PHP內部的好奇心。到目前爲止,我的研究大多似乎發現人們對PHP中的範圍感到困惑。PHP變量重用

在內存或速度中,重用PHP變量是否會帶來任何好處/不利影響?對於科學。

假設您在整個腳本中順序訪問多個文件。

  • 場景A:你的手柄各有一個變量$文件1,$文件2,$文件3等
  • 方案B:你處理所有重用變量$ fp的

請問這個理論情景分別需要資源密集型腳本嗎? B會允許垃圾收集擺脫舊手柄,而A不會?通過Zend進行優化是否使得這兩方面都不是問題?

+1

IIRC,PHP的垃圾收集器一旦超出範圍就從內存中刪除變量。釋放一個變量不會產生巨大影響。 – Blender

+0

我的預感是B使用的內存稍少,但兩者都可能是糟糕的編碼習慣。這聽起來像你想要的是編寫一個函數,對這些文件做些什麼,並調用它三次。不要把所有東西都放到一個大範圍內。編寫小巧,易管理的函數,並在函數結束時讓不需要的變量超出範圍。 – Okonomiyaki3000

+0

由於您在此處詢問了有關文件句柄的問題,因此您可能希望從其他方面查看:如果使用變量關閉文件會發生什麼情況? [可以通過取消設置手柄來關閉文件嗎?](http://stackoverflow.com/q/10928892/367456) – hakre

回答

4

這個問題沒有切割&乾的答案。優化和性能將在很大程度上取決於您的特定代碼庫,運行的平臺,服務器上還運行着什麼,等等。

要開始您的情景太模糊,以提供足夠的答案。然而,要觸及一些先前的意見/疑慮......

PHP沒有非常明確的垃圾收集規則。在THEORY場景中,當函​​數因垃圾收集而退出時,A將釋放內存。實際上這很少發生。有很多觸發器會導致垃圾回收來釋放內存,但幕後實際的低級別free()和mallocs()不會被幹掉。如果你仔細觀察你的內存堆棧,你會發現在一個函數退出$ file1,$ file2,$ file3的內存空間後將會保留。有時直到整個應用程序退出。

您的應用程序構造還將決定哪個更快,在$ file1,$ file2,$ file3的符號表中創建一個新條目,或者在&之上重新使用$ fp。在理論上再次使用$ fp通常意味着內存空間不需要重新分配,並且不需要重新創建新的符號表條目和相應的管理對象。然而,這並非總是如此。有時候重新使用$ fp實際上會比較慢,因爲需要首先調用destroy,然後重新創建對象。在某些情況下,在迭代過程中創建一個新的$ file1,$ file2,$ file3可能會更快,並且讓垃圾收集一次全部發生。

所以,這一切的底線....

您需要分析,並在其原生環境中測試自己的應用學習的東西在你的操場上如何表現。很少有「永遠這樣做」或「永遠不會這樣」的情況。

+0

確實。我知道這將是一個挑剔的複雜問題。我讚賞你對這兩種情況的分析。我認爲你理解我在通用內存使用/性能方面試圖獲得的內容。關於Zend如何更復雜的知識?一般來說,它只是聲稱「[轉]由標準Zend運行時編譯器生成的中間代碼,並[爲了更快執行而優化]。」我想知道如何以這種方式使用變量可能會影響事物。看起來好像它可能會重複使用相同的數據類型...... – Liandri

0

對我的回答沒有信心,但我確實發現重用變量可以節省更多的內存,尤其是當重複使用查詢結果的變量時,這些變量通常會填充其他許多不需要的東西。

您可以使用

echo memory_get_usage()在不同階段的執行代碼的看出區別和比較。

但是隨着代碼的增長,它可能會讓人困惑,讓人們難以閱讀。

當腳本完成時,PHP也運行垃圾收集。所以如何命名你的變量可能與它沒有任何關係,而是會影響它在執行過程中使用多少內存。