一般说明
我正在使用websockets(棘轮)开发一个聊天系统。聊天效果很好,但我的数据库类有一些问题。
问题
在开发过程中,聊天系统显然访问量不大。这会导致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致命错误:uncaughtpdoexception:sqlstate[hy000]:一般错误:2006 mysql服务器在/var/www/clients/client1/web4/web/src/pdo中消失了。php:43 stack 跟踪:
/var/www/clients/client1/web4/web/src/pdo.php(43):pdostatement->execute()
这个错误指向 return $this->stmt->execute();
在 execute()
方法。
当我清楚地捕捉到错误时,错误怎么可能告诉我“未捕获的异常”?
当我不使用持久连接时,mysql服务器怎么能断开连接呢? PDO::ATTR_PERSISTENT => false,
1条答案
按热度按时间2w2cym1i1#
正如在注解中确定的,您正在另一个命名空间中运行此代码。这意味着
catch (PDOException $e)
实际上是catch (\Your\Namespace\PDOException $e)
所以不起作用。您需要在类的前面加一个前导反斜杠,将其放入全局命名空间:或者
use
代码开头的类。