pdo:mysql服务器已经消失,无法捕获异常

kpbwa7wx  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(327)

一般说明
我正在使用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,

2w2cym1i

2w2cym1i1#

正如在注解中确定的,您正在另一个命名空间中运行此代码。这意味着 catch (PDOException $e) 实际上是 catch (\Your\Namespace\PDOException $e) 所以不起作用。您需要在类的前面加一个前导反斜杠,将其放入全局命名空间:

catch(\PDOException $e){
    $this->error = $e->getMessage();
    return $this->error;
}

或者 use 代码开头的类。

use \PDOException;

相关问题