2012-06-22 48 views
1

我需要擔心PHP的內存泄漏嗎?特別是,我有以下從瀏覽器中調用的代碼。當調用完成時,是否正確清理了所有內容,或者,是否需要清除由創建的第一個數組創建的內存?PHP內存管理和陣列

class SomeClass 
{ 
    var $someArray = array(); 

    function someMethod() 
    { 
    $this->someArray[1] = "Some Value 1"; 
    $this->someArray[2] = "Some Value 2"; 
    $this->someArray[3] = "Some Value 3"; 
    $this->someArray = array(); 
    $this->someArray[1] = "Some other Value"; 
    $this->someArray[2] = "Some other Value"; 
    $this->someArray[3] = "Some other Value"; 
    } 
} 

someMethod(); 

感謝, 斯科特

+2

每個腳本調用都會啓動一個新的PHP進程。這些呼叫之間的所有內存都會丟失。 – mario

回答

3

我需要擔心PHP的內存泄漏嗎?

很可能在PHP循環引用,其zvalrefcount從來沒有下降到0。這會導致內存泄漏(GC不會清除引用它們的對象)。這已經修復在> = PHP 5.3中。

特別是,我從瀏覽器中調用以下代碼。當調用完成時,是否正確清理了所有內容,或者,是否需要清除由創建的第一個數組創建的內存?

PHP腳本有請求生命週期(運行應用程序,返回響應,關閉應用程序),所以它不應該是一個隱憂。應用程序完成時,應用程序使用的所有內存都應標記爲「已釋放」,並準備在下一次請求時被覆蓋。

+1

我相信從PHP 5.3起,循環引用問題已得到解決。 – Corbin

+0

@Corbin你是對的,只是發現它在一些[幻燈片](http://www.slideshare.net/phpcodemonkey/whats-new-whats-hot-in-php-53)中提到。我會做一個編輯。 – alex

1

如果你是超級偏執狂,你可以隨時unset的事情,但是,PHP是一個垃圾回收語言的含義,除非有在覈心或擴展的錯誤,永遠不會有內存泄漏。

More information


在一個側面說明,你應該使用較新的PHP 5 OOP的語法。而且,有些方法會是一個錯誤。它需要是$ obj-> someMethod(),其中$ obj是類的一個實例。

+0

太好了。謝謝... –

1

如果通過Apache運行mod_php並使用mpm_prefork行爲,實際上確實存在內存問題。問題是PHP使用的內存不會被釋放回操作系統。相同的Apache進程可以爲後續請求重用內存,但不能被其他程序使用(甚至不能用於其他Apache進程)。

一個解決方案是不時重新啓動進程,例如將MaxRequestsPerChild設置設置爲較低(100左右,對於輕度加載的服務器可能較低)。最好的解決方案是根本不使用mod_php,而是通過FastCGI運行PHP。

這是一個系統管理員問題,但不是程序員問題。

+0

+1相關知識 – alex