微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

当我运行代码时,它将创建一个连接.当我刷新页面时,将创建另一个连接(选中的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一个shared nothing”环境.由PHP应用程序处理的每个请求都与其他所有请求隔离开来,这些请求既可以是单独的线程,也可以是单独的进程(取决于所使用的server api (SAPI)).您设计的类是singleton,但是它被隔离到单个请求-响应周期中.这意味着,如果在单个请求中调用Db :: getInstance()10次,您将获得10个对同一对象的引用,但是在单独请求中的单个调用将创建并返回一个不同的对象.

您可以在服务器或应用程序端使用某种类型的连接池,以减少与后端数据库服务器建立的并发连接数. PHPPDO抽象通过PDO::ATTR_PERSISTENT连接驱动程序选项启用了应用程序侧连接池.这些池化连接将缓存在PHP父进程中,而不是处理请求并随后重用的工作线程/进程中.根据您的SAPI和基础数据库类型,将打开的连接的确切数目以及如何共享它们是可变的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐