通过PHP类连接MySQL数据库的单个实例

通过PHP类连接MySQL数据库的单个实例,php,mysql,oop,Php,Mysql,Oop,我有以下数据库类。我的想法是,这将检查类的现有实例并返回该实例,而不是创建新的数据库连接 当我运行代码时,它会创建一个连接。当我刷新页面时,会创建另一个连接(选中MySQL连接) 我的想法不对吗?对于使用OOP来说是相当新的,所以对于这个新手的问题,我深表歉意 任何正确方向的帮助或指点都将不胜感激 非常感谢 <?php class Db { private $_connection; private static $_instance; private $_hos

我有以下数据库类。我的想法是,这将检查类的现有实例并返回该实例,而不是创建新的数据库连接

当我运行代码时,它会创建一个连接。当我刷新页面时,会创建另一个连接(选中MySQL连接)

我的想法不对吗?对于使用OOP来说是相当新的,所以对于这个新手的问题,我深表歉意

任何正确方向的帮助或指点都将不胜感激

非常感谢

<?php
class Db
{
    private $_connection;
    private static $_instance; 
    private $_host = 'localhost';
    private $_username = 'root';
    private $_password = 'password';
    private $_database = 'test';

    public static function getInstance()
    {
        if (!self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    private function __construct()
    {
        try {
            $this->_connection  = new PDO("mysql:host=$this->_host;dbname=$this->_database", $this->_username, $this->_password); 
            echo 'Connected to database';
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

    private function __clone()
    {
    }

    public function getConnection()
    {
    return $this->_connection;
    }
}

$db = Db::getInstance();

在服务器端语言中使用PHP时,了解后台发生的事情可能是一件好事

当您运行该代码时,PHP会为您启动连接。它不会在页面加载后保持连接

在每个页面上,都会打开新的连接,以便您可以继续发出请求并执行任务

想想如果它真的发生了会发生什么。关闭页面并进入睡眠状态,服务器将永远保持与数据库的开放连接。你得到了一些访问者,然后你达到了你的连接限制,并得到一个错误

可能有一些引用,但我真的找不到太多,因为这更像是一个逻辑问题,而不是一个编码问题。

PHP是一个“”环境。PHP应用程序处理的每个请求都作为单独的线程或单独的进程与所有其他请求隔离,具体取决于所使用的线程。您设计的类是一个类,但它被隔离到单个请求-响应周期。这意味着,如果在单个请求期间调用
Db::getInstance()
10次,您将获得对同一对象的10个引用,但在单独请求中的单个调用将创建并返回一个不同的对象


您可以在服务器端或应用程序端使用某种类型的连接池,以减少与后端数据库服务器的并发连接数。PHP的抽象通过连接驱动程序选项支持应用程序端连接池。这些池连接缓存在PHP父进程中,而不是处理请求并随后重用的工作线程/进程中。将打开的连接的确切数量以及它们的共享方式是可变的,这取决于您的SAPI和基础数据库类型。

每次刷新页面时,您都会实例化一个全新的Db对象,并将其分配给一个名为$Db的全新变量,因此每次都会获得连接。我还认为您可能使Db类过于复杂

当我创建db类来包装PDO或mysqli时,我的想法是创建一个db对象,在实例化时,该对象将包括一个数据库连接作为其属性之一。为了做到这一点,我将重写你的课程。类似这样的东西将是您创建具有私有连接的Db对象所需的全部,该连接可由您希望添加到类中的任何其他方法使用。。。比如,发出查询的方法

class Db
{
    private $_connection;
    private $_host = 'localhost';
    private $_username = 'root';
    private $_password = 'flindersbeast';
    private $_database = 'flinders';

    public function __construct()
    {
        try {
            $this->_connection = new PDO("mysql:host=$this->_host;dbname=$this->_database", $this->_username, $this->_password); 
            echo 'Connected to database';
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

    // Other methods here will use $this->_connection to do a variety of things.
    public function example()
    {
     // Do stuff - as needed you can pass $this->_connection to PDO 
    }
}

$db = new Db;
祝你好运