据我所知,当一个对象的引用计数变为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)
{
....
....
}
提前致谢!
答案 0 :(得分:0)
此代码不会泄漏。一旦你摆脱了引用,PHP就会自动收集垃圾。上面的代码是PHP的一个非常简单的例子 - 所有引用都只是局部变量。因此,完成该功能或脚本会自动删除参考,您不需要为此做任何事情。
这条线不是一个值得关注的问题:
$ dbh = mySQLConnect(); //参考计数= 2
实际上,ref count会有1.因为,当mySQLConnect()
返回值时,它的变量$dbh
被释放,因此对PDO对象的引用计数减少了 - 它变为0(但是GC尚未被调用,因为函数返回正在进行中)。同时,PHP脚本中的变量$dbh
获得了该PDO对象,因此对它的引用增加并变为1。
这一行也不是一个问题:
//脚本停止,引用计数变为0并释放内存 - 或者是它?
这里的主要规则是当PHP脚本完成时 - 然后所有对象都被PHP释放。在这个阶段,参考计数无关紧要。 PHP返回它获得的所有内存,因为它知道工作已经结束,并且不再需要变量。下次调用PHP脚本时,它从头开始 - 没有变量,没有引用计数,没有上一次执行的数据。