Общее описание Я работаю в системе чатов с использованием веб-сокетов (Ratchet).Чат работает отлично, но у меня возникли проблемы с классом базы данных.
Проблема Во время разработки система чатов явно не посещалась.Это заставляет сервер MySQL закрывать соединение в конце концов.Чтобы решить эту проблему, я написал несколько обработчиков исключений для повторного подключения к серверу MySQL.Но почему-то это не работает.Вот самый минимум того, как выглядит мой код:
<?php
Class Database {
private $host = DB_HOST;
private $user = DB_USER;
private $pass = DB_PASS;
private $dbname = DB_NAME;
private $dbh;
private $error;
private $stmt;
public function __construct(){
if($this->dbh === null){
$this->reconnect();
}
}
private function reconnect(){
// Set DSN
$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
// Set options
$options = array(
PDO::ATTR_PERSISTENT => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
// Create a new PDO instanace
try{
$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
}
// Catch any errors
catch(PDOException $e){
$this->error = $e->getMessage();
return $this->error;
}
}
/* Execute query */
public function execute(){
try{
return $this->stmt->execute();
}
catch(PDOException $e){
$this->reconnect();
try{
return $this->stmt->execute();
}
catch(PDOException $e){
$this->error = $e->getMessage();
return $this->error;
}
}
}
Конечно, есть много других симуляционных методов, но они не важны.
Ошибка, с которой я сталкиваюсь:следующее:
Неустранимая ошибка PHP: Uncaught PDOException: SQLSTATE [HY000]: Общая ошибка: 2006 сервер MySQL исчез в / var / www / clients / client1 / web4 / web / src / Pdo.php: 43 Трассировка стека:/var/www/clients/client1/web4/web/src/Pdo.php(43): PDOStatement-> execute ()
Эта ошибка указывает на return $this->stmt->execute();
в методе execute()
выше.
- Как это возможно, что ошибка говорит мне "Uncaught PDOException" , пока я его четко ловлю?
- Как работает сервер MySQLдаже в состоянии отключиться, пока я не использую постоянное соединение?
PDO::ATTR_PERSISTENT => false,