我有以下数据库类.我的想法是,这将检查类的现有实例并返回该实例,而不是创建新的数据库连接.
当我运行代码时,它将创建一个连接.当我刷新页面时,将创建另一个连接(选中的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个对同一对象的引用,但是在单独请求中的单个调用将创建并返回一个不同的对象.
您可以在服务器或应用程序端使用某种类型的连接池,以减少与后端数据库服务器建立的并发连接数. PHP的PDO抽象通过PDO::ATTR_PERSISTENT
连接驱动程序选项启用了应用程序侧连接池.这些池化连接将缓存在PHP父进程中,而不是处理请求并随后重用的工作线程/进程中.根据您的SAPI和基础数据库类型,将打开的连接的确切数目以及如何共享它们是可变的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。