我有以下数据库类。我的想法是,这将检查类的现有实例并返回该而不是创建新的数据库连接。
当我运行代码时,它会创建一个连接。当我刷新页面时,会创建另一个连接(检查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();
答案 0 :(得分:3)
PHP是&#34; shared nothing&#34;环境。 PHP应用程序处理的每个请求都作为单独的线程或单独的进程与所有其他请求隔离,具体取决于所使用的server api (SAPI)。您设计的类是singleton,但它与单个请求 - 响应周期隔离。这意味着如果您在单个请求期间调用Db::getInstance()
10次,您将获得对同一对象的10个引用,但单个请求中的单个调用将创建并返回不同的对象。
您可以在服务器端或应用程序端使用某种类型的连接池,以减少对后端数据库服务器的并发连接数。 PHP的PDO抽象通过PDO::ATTR_PERSISTENT
连接驱动程序选项启用应用程序端连接池。这些池化连接缓存在PHP父进程中,而不是处理请求并随后重用的工作线程/进程。根据您的SAPI和底层数据库类型,将打开的确切连接数以及它们的共享方式是可变的。
答案 1 :(得分:0)
当使用PHP作为服务器端语言时,理解后台发生的事情可能是一件好事。
PHP在您运行该代码时为您启动连接。它不会持续超过页面加载的连接。
在每个页面上加载新连接将被打开,以便您可以继续发出请求并执行任务。
考虑一下如果会发生什么。您关闭页面并进入休眠状态,服务器将永久保持与数据库的开放连接。您获得了一些访问者,然后达到了连接限制并收到too many connections错误。
可能有一些引用的引用,但我真的找不到很多,因为这更像是一个编码问题的逻辑问题。
答案 2 :(得分:0)
每次刷新页面时,您都要实例化一个全新的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;
祝你好运!