在MySQL服务器上重新连接已经消失

Hyd*_*erA 6 php mysql error-handling pdo

如何修改此类以捕获MySQL服务器离开的异常并重新连接?

<?php
class DBConn
{
private $conn;

public function __construct( $persistent = false )
{
    try
    {
        $this->conn = new PDO( "mysql:host=localhost;dbname=test", 'test', "hoollaahaoo" );
        $this->conn->exec( "SET CHARACTER SET utf8" );
        $this->conn->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC ); 
        if ( $persistent )
            $this->conn->setAttribute( PDO::ATTR_PERSISTENT, true );
    }
    catch( PDOException $e )
    {
        return $e->getMessage();
    }
}

public function getConn()
{
    return $this->conn;
}
}
Run Code Online (Sandbox Code Playgroud)

Sub*_*ger 3

你可能需要像这样创建自己的课程

  1. try/except从......中去除__construct
  2. 然后像这样连接到你的数据库:
$conn = null;
$限制= 10;
$计数器= 0;
而(真){
  尝试 {
    $conn = DBConn();
    休息;
  }
  捕获(异常$e){
    $conn = null;
    $计数器++;
    if ($counter == $limit)
      抛出$e;
  }

}

编辑1

但如果你说你的服务器消失了......那么可能是这样的

protected function _connect( $persistent = false ) {
$conn = null;
$limit = 10;
$counter = 0;
while (true) {
  try {
        $this->conn = new PDO( "mysql:host=localhost;dbname=test", 'test', "hoollaahaoo" );
        $this->conn->exec( "SET CHARACTER SET utf8" );
        $this->conn->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC ); 
        if ( $persistent )
            $this->conn->setAttribute( PDO::ATTR_PERSISTENT, true );
}
  catch (Exception $e) {
    $conn = null;
    $counter++;
    if ($counter == $limit)
      throw $e;
  }
}

public function __construct( $persistent = false )
{
    $this->_connect($persistent);
}
Run Code Online (Sandbox Code Playgroud)

  • 但这不是捕获所有异常吗?我们不应该只捕获“MySQL 服务器已消失”吗? (2认同)