Reputation: 8773
General Description
I'm working a chatsystem using websockets (Ratchet). The chat works perfectly fine, but I'm having some issue with my database class.
The Problem
During development, the chatsystem obviously isn't visited a lot. This causes the MySQL server to close the connection eventually. To solve that issue, I've written some exception handlers to reconnect to the MySQL server. But somehow this doesn't work. Here's the bare minimum of how my code looks like:
<?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;
}
}
}
Of course there are many more simular methods, but those are not important.
The error I'm being presented with is the following:
PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away in /var/www/clients/client1/web4/web/src/Pdo.php:43 Stack trace:
/var/www/clients/client1/web4/web/src/Pdo.php(43): PDOStatement->execute()
That error points to return $this->stmt->execute();
in the execute()
method above.
PDO::ATTR_PERSISTENT => false,
Upvotes: 3
Views: 2575
Reputation: 42709
As determined in the comments, you're running this code within another namespace. This means that catch (PDOException $e)
is actually catch (\Your\Namespace\PDOException $e)
so will not work. You'll either need to prefix the class with a leading backslash to put it in the global namespace:
catch(\PDOException $e){
$this->error = $e->getMessage();
return $this->error;
}
Or use
the class at the beginning of your code.
use \PDOException;
Upvotes: 4