【发布时间】:2016-02-06 18:57:51
【问题描述】:
我是 PHP 高级新手。但对编程并不陌生。
我们有一个正在杀死我们的数据库的软件(已关闭但仍处于活动状态)。
里面使用了PDO 花了很多时间后的问题是PDO断开模式和使用了一个包装类里面的PDO。
public function connect() {
if(!$this->connected){
$col = 'mysql:host='
.$this->parametri->getHOST()
.';'
.'dbname='
.$this->parametri->getDB()
.';'
.'charset=utf8';
try {
// connessione tramite creazione di un oggetto PDO
$db = new PDO($col , $this->parametri->getDBUSER(),
$this->parametri->getPASS());
$this->pdoconn=$db;
$this->connected=TRUE;
}
catch(PDOException $e) {
$this->connected=FALSE;
return NULL;
}
}
return $this->pdoconn;
}
public function getPDO(){
if ($this->connected){
return $this->pdoconn;
}else {
return NULL;
}
}
public function disconnect() {
$this->pdoconn=null;
$this->connected=FALSE;
}
在官网阅读PDO文档和cmets当$this->pdoconn=null时连接被释放; 但它已通过 getPDO() 传递。
根据this article 和this dissertion,某处可能存在指向连接的变量,因此连接永远不会被释放;该类认为该连接已被释放,并且当请求创建一个新连接时,该连接会将最后一个连接丢失给该类的用户。
所以我们的想法是将连接 tu null 也传回 this 或者有另一种方法来保护 pdoconn 并强制为 null。
public function disconnect(&$var) {
$var=null;
$this->pdoconn=null;
$this->connected=FALSE;
}
另一种方法是构建一个永远不会暴露 pdo 连接的包装类,并强制在其中执行查询以管理断开连接。
【问题讨论】:
-
拥有一个分配连接的静态变量(单例)怎么样。几乎是您现在拥有的,但静态的,因此它重用相同的连接,因为静态将持续存在而不创建新的连接。
-
两种方案都很有趣不知道该投哪一种
-
试一试,看看您的数据库负载是否得到解决。