PDO: сервер MySQL ушел, не может поймать исключение - PullRequest
0 голосов
/ 07 октября 2018

Общее описание Я работаю в системе чатов с использованием веб-сокетов (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()выше.

  1. Как это возможно, что ошибка говорит мне "Uncaught PDOException" , пока я его четко ловлю?
  2. Как работает сервер MySQLдаже в состоянии отключиться, пока я не использую постоянное соединение?PDO::ATTR_PERSISTENT => false,

1 Ответ

0 голосов
/ 07 октября 2018

Как определено в комментариях, вы запускаете этот код в другом пространстве имен.Это означает, что catch (PDOException $e) на самом деле catch (\Your\Namespace\PDOException $e), поэтому не будет работать.Вам нужно будет либо поставить префикс перед начальным обратным слешем, чтобы поместить его в глобальное пространство имен:

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

или use класс в начале вашего кода.

use \PDOException;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...