Я новичок в высоком уровне 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 и комментариев на официальном сайте соединение освобождается, когда $ this-> pdoconn = null; но он прошел через getPDO ().
Согласно этой статье и this dissertion, где-то может быть переменная, указывающая на соединение, поэтому соединение никогда не будет освобожден; класс думает, что соединение освобождено, и при запросе создает новое соединение, теряя последнее для пользователя класса.
Итак, идея состоит в том, чтобы передать обратно соединение tu null, также это или есть другой способ защитить pdoconn и принудительно установить значение null.
public function disconnect(&$var) {
$var=null;
$this->pdoconn=null;
$this->connected=FALSE;
}
Другой способ - создать другой класс обертывания, который никогда не будет открывать соединение pdo и принудительно выполнять запрос внутри него, чтобы управлять также отключением.