PHP:这段代码会导致内存泄漏吗?

时间:2016-08-09 21:38:21

标签: php memory-leaks

据我所知,当一个对象的引用计数变为0时,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 :(得分:0)

此代码不会泄漏。一旦你摆脱了引用,PHP就会自动收集垃圾。上面的代码是PHP的一个非常简单的例子 - 所有引用都只是局部变量。因此,完成该功能或脚本会自动删除参考,您不需要为此做任何事情。

这条线不是一个值得关注的问题:

  

$ dbh = mySQLConnect(); //参考计数= 2

实际上,ref count会有1.因为,当mySQLConnect()返回值时,它的变量$dbh被释放,因此对PDO对象的引用计数减少了 - 它变为0(但是GC尚未被调用,因为函数返回正在进行中)。同时,PHP脚本中的变量$dbh获得了该PDO对象,因此对它的引用增加并变为1。

这一行也不是一个问题:

  

//脚本停止,引用计数变为0并释放内存 - 或者是它?

这里的主要规则是当PHP脚本完成时 - 然后所有对象都被PHP释放。在这个阶段,参考计数无关紧要。 PHP返回它获得的所有内存,因为它知道工作已经结束,并且不再需要变量。下次调用PHP脚本时,它从头开始 - 没有变量,没有引用计数,没有上一次执行的数据。