2016-08-09 14 views
0

私が理解したように、PHPのガベージコレクタは、オブジェクトの破壊の世話をします。PHP:このコードはメモリリークの原因になりますか?オブジェクトの参照カウントが0になると

私はPDOオブジェクトを作成し、そのオブジェクトをPDO操作の呼び出しスクリプトに返すデータベース接続用のユーティリティ関数を持っています。

私はこのコードをモバイルクライアントの要求に対応するウェブサーバースクリプトのどこにも置いているので、アプリが公開されたときに詳細を見落としたりメモリリークを起こすことはありません。

ここに問題がありますか? connectDB.phpで

:PHPスクリプトで

function mySQLConnect() { 

    ..... 
    ..... 

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

     .... 
     return $dbh;  

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

    } 
} 

:事前に

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'があなたのコード全体に必要となると仮定しなければなりません。そして、スクリプトがteminationに走ると、それはメモリ不足に洗浄され、それはあなたが常にPDO' 'の**新しい**インスタンスを作成している – RiggsFolly

答えて

0

このコードは、リークされません。参照を取り除くと、PHPは自動的にゴミを収集します。上のコードはPHPにとって非常に単純なケースです。すべての参照は単なるローカル変数です。したがって、関数やスクリプトを終了すると自動的に参照が削除されますので、何もする必要はありません。

そして、この行が問題のポイントではありません。

$ DBH = mySQLConnect();それが0になりました( - mySQLConnect()が値を返されたときに、その変数$dbhがリリースされた、とPDOオブジェクトへので参照カウントが減少した、ので//参考カウント= 2

実際には、参照カウントが1にあるだろう関数のリターンが進行中であったため、GCはまだ呼び出されていませんでした)。同時に、PHPスクリプト内の変数$dbhは、PDOオブジェクトを持って、これへの参照も、この行も問題ではないの増加と1

となりました:

//スクリプトを停止し、 Ref Countは0になり、メモリは解放されますか?

ここで重要なルールは、PHPスクリプトが終了すると、すべてのオブジェクトがPHPによって解放されることです。参照カウントはこのフェーズでは重要ではありません。 PHPは、すべてのメモリを返します。なぜなら、作業が終了し、変数はもう必要なくなるからです。 PHPスクリプトが呼び出された次回は、ゼロから始めます。変数はなく、参照カウントはなく、以前の実行のデータはありません。

+0

あなたの説明のためにたくさんありがとうAndrey ..最高の意見.. – Tanner

関連する問題