2016-08-09 59 views
0

據我所知,當一個對象的引用計數變爲0時,PHP的垃圾回收器負責銷燬對象。PHP:這段代碼會導致內存泄漏嗎?

我有一個用於數據庫連接的實用函數,其中創建一個PDO對象並將該對象返回給PDO操作的調用腳本。

因爲我已經將這段代碼遍佈在將要爲移動客戶端請求提供服務的web服務器腳本的地方,所以關鍵是我不會忽略細節,並在應用程序上線時發生內存泄漏。

你看到這裏有什麼問題嗎?

在connectDB.php:

function mySQLConnect() { 

    ..... 
    ..... 

    try 
    { 
     $dbh = new PDO($dsn, $user, $password, $options); // Ref Count=1 

     .... 
     return $dbh;  

    } 
    catch (PDOException $e) 
    { 
     .... 
     return NULL; 

    } 
} 

在PHP腳本:

include 'connectDB.php'; 

try 
{ 

    $dbh = mySQLConnect();  // Ref Count =2 
    .... 
    .... 

} //Script Stops, Ref Count becomes 0 and memory is freed- or is it? 

catch (Exception $e) 
{ 
    .... 
    .... 

} 

提前感謝!

+1

會嗎?測試它! –

+0

你很可能不需要擔心這一點。見http://blog.ircmaxell.com/2014/12/what-about-garbage.html – Machavity

+0

什麼也漏。我們必須假設在您的代碼中將需要'$ dbh'。請記住,一旦腳本運行到結束,它就會被清除內存,它不會等待再次使用。 – RiggsFolly

回答

0

此代碼不會泄漏。一旦你擺脫了引用,那麼PHP會自動收集垃圾。上面的代碼是PHP的一個非常簡單的例子 - 所有的引用都只是局部變量。因此,完成功能或腳本會自動刪除參考,您不需要爲此做任何事情。

而此行是不是一個值得關注的點:

$胸徑= mySQLConnect(); // ref計數= 2

實際上,ref計數會有1.因爲,當mySQLConnect()返回的值,它的可變$dbh被釋放,並且因此引用計數到PDO對象下降 - 它成爲0(但GC尚未被調用,因爲函數返回正在進行中)。同時在PHP腳本變量$dbh得到了PDO對象,因此對它的引用增加,成爲1

而且這一行也不是一個問題:

//腳本停止, Ref Count變爲0並且內存被釋放 - 或者它是什麼?

這裏的主要規則是,當一個PHP腳本完成時 - 那麼所有的對象都被PHP釋放。在這個階段,Ref的數量並不重要。 PHP返回它獲得的所有內存,因爲它知道工作已經結束,並且變量將不再需要。下一次調用PHP腳本時,它將從頭開始 - 沒有變量,沒有引用計數,也沒有前一次執行的數據。

+0

謝謝你的解釋安德烈..最好的問候.. – Tanner

相關問題