PHP PDO关闭DatabaseFactory文件

时间:2017-09-14 16:48:09

标签: php mysql pdo

你知道为什么我不能关闭mysql连接吗?

这是我的代码:

class DatabaseFactory {
    private static $factory;
    private $connection = array(
        "DB_HOST" => "localhost",
        "DB_PASS" => "*************",
        "DB_USER" => "*************",
        "DB_PORT" => "3306",
        "DB_CHARSET" => "utf8"
    );

    public static
    function getFactory() {
        if(!self::$factory) {
            self::$factory = new DatabaseFactory();
        }
        return self::$factory;
    }

    private $db;

    public
    function getconnection($name) {
        echo "opened";
        try {
            $options = array(
                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ,
                \PDO::ATTR_ERRMODE => \PDO::ERRMODE_WARNING
            );
            $this->db = new \PDO('mysql:host='.$this->connection["DB_HOST"].';dbname='.$name.';port=' .$this->connection["DB_PORT"].';charset='.$this->connection["DB_CHARSET"], $this->connection["DB_USER"], $this->connection["DB_PASS"], $options);
        } catch (PDOException $e) {
            exit($e->getMessage());
        }
        return $this->db;
    }

    public
    function __destruct() {
        echo "closed";
        try {
            $this->db = null;
            unset($this->db);
        } catch (PDOException $e) {
            exit($e->getMessage());
        }
    }
}

$database = DatabaseFactory::getFactory()->getconnection("Admin");
$query = $database->prepare("SELECT * FROM tester WHERE t_u_id = :u_id");
$query->execute(array(":u_id" => "281123341528-D050C4-91A0BA-1CB0C8-8112334152855AC373"));

连接正在连接但未关闭。 将调用方法__destruct,但mysql总连接数不会减少。

1 个答案:

答案 0 :(得分:3)

为什么不在他的回复here中实施和调用方法(手动而不是依赖__destruct()),如Fil做的那样?

将以下static方法添加到DatabaseFactory

static function closeConnection(&$conn) {
    $conn=null;
}

因此,在您的连接之后,您可以在代码中稍后NULL建立您的连接引用(类似于调用$mysqli_conn->close();):

$database = DatabaseFactory::getFactory()->getconnection("Admin");
$query = $database->prepare("SELECT * FROM tester WHERE t_u_id = :u_id");
$query->execute(array(":u_id" => "281123341528-D050C4-91A0BA-1CB0C8-8112334152855AC373"));

DatabaseFactory::closeConnection($database)

编辑:

另外,我想依靠__destruct()提及,PHP docs符合以下条件:

  

PHP 5引入了类似于其他概念的析构函数概念   面向对象的语言,例如C ++。析构函数方法将是   只要没有其他特定参考,就会调用   对象,或在关机序列期间的任何顺序。

关于您的问题,可能不会调用方法__destruct(),因为静态类var private static $factory永远不会被置为空。因此,该类始终引用“本身”来阻止__destruct()被调用。

我希望这有帮助!