2016-08-09 60 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

相关问题