关闭连接时出现 Mysql 错误


Mysql error in closing the connection

我有这个用于数据库交互的类。它工作正常。

<?php require_once('inc/config.inc.php'); ?>
<?php
final class MySQL {
private $link;
public function __construct($hostname, $username, $password, $database) {
    if (!$this->link = mysql_connect($hostname, $username, $password)) {
        //error('Error: Could not make a database link using ' . $username . '@' . $hostname);
    }
    if (!mysql_select_db($database, $this->link)) {
        //error('Error: Could not connect to database ' . $database);
    }
    //echo "open". time();
}
public function __destruct() {
    mysql_close(); // Problem In here
    //echo "closed". time();
}
}
$database=new MySQL(DB_SERVER,DB_USER,DB_PASS,DB_NAME);
?>

但是如果我更换 mysql_close();跟 mysql_close($this->链接);

我收到一个错误: 警告:mysql_close() 期望参数 1 是资源,给定

空值

此错误的原因很简单:$this->link 是一种资源。并且(引用文档本身)...

。自动检测不再引用的资源, 它被垃圾收集器释放。因此,它是 很少需要手动释放内存。

换句话说,它在调用__destruct方法之前关闭。更重要的是,在mysql_close文档中说:

通常不需要使用 mysql_close(),因为非持久打开 链接在脚本执行结束时自动关闭。

顺便说一下,我通常认为__destruct是内部方法(很少找到它的用处):PHP 并不C++,释放资源的整个概念在这里是相当不同的(有很多原因)。如果我需要执行一些清理任务,我通常会使用register_shutdown_function,因为事实证明它更容易预测。

我会使用

PDO 而不是使用自产的mysql包装器。

如果做不到这一点,PHP 会自行关闭非持久性数据库连接。 它可能在调用对象析构函数之前执行此操作,从而避免了对该方法的需求。