2011-07-28 5 views
6

このクラスを変更して、MySQL Serverがどこに行かなくなった場合に例外をキャッチして再接続することができますか?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; 
} 
} 
+0

グラブ息子のようななめらかであってよく、彼を家に持って来ます。しかし真剣に、私はPDOオブジェクトを再初期化することで再接続できないはずですか?キーとなる質問は、クエリをキャッチしてメソッドを実行するフックを設定する方法です。 – HyderA

答えて

3

あなたはおそらく、あなたに接続し、その後__construct

  • からtry/exceptを削除この1

    1. のように独自のクラスを作成する必要がありますこのようなDB:
    $conn = null; 
    $limit = 10; 
    $counter = 0; 
    while (true) { 
        try { 
        $conn = DBConn(); 
        break; 
        } 
        catch (Exception $e) { 
        $conn = null; 
        $counter++; 
        if ($counter == $limit) 
         throw $e; 
        } 
    
    }

    をEDIT 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); 
    } 
    
  • +1

    しかし、これはすべての例外をキャッチしていますか?私たちは 'MySQL Server Has Has Away'を捕まえるべきではないでしょうか? – azerafati

    +1

    @Bludreamはい、私はPDOException(他の例外の種類は私たちの問題ではありません)だけをキャッチする必要があることに同意します。次に、私はPDOexceptionsのコードがSQLサーバーが生成したエラーコードに設定されていると思います。あなたは、SQLサーバの特定のコードがなくなったことを確認することができます(あなた自身でそれを見なければなりません)。最後に、接続要求でサーバーを叩くだけなので、再接続を試みる前にスリープ状態にする必要があります。サーバーが一時的な開始(例えば、起動中)の場合、接続を拒否することがありますが、後でその接続を受け入れます。 – GordonM

    関連する問題