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

时间:2011-07-28 14:32:17

标签: php mysql error-handling pdo

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

<?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;
}
}

1 个答案:

答案 0 :(得分:3)

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

  1. try/except
  2. 中移除__construct
  3. 然后连接到你这样的数据库:
  4. $conn = null;
    $limit = 10;
    $counter = 0;
    while (true) {
      try {
        $conn = DBConn();
        break;
      }
      catch (Exception $e) {
        $conn = null;
        $counter++;
        if ($counter == $limit)
          throw $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);
    }