2011-07-28 20 views
6

MySQL Server'ın Uzaklaştığı ve yeniden bağlanacağı istisnayı yakalamak için bu sınıfı nasıl değiştirebilirim?MySQL Sunucusuna Yeniden Bağlanmak İçin Çıktı

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

tut oğul gibi Tavsiyen olabilir eve getirmek. Ama cidden, PDO nesnesini yeniden başlatarak yeniden bağlanamamalı mıyım? Sorduğum önemli soru, sorguyu yakalamak ve yöntemleri yürütmek için nasıl bir kanca kurulacağıdır. – HyderA

cevap

3
Eğer böyle db için muhtemelen daha sonra bağlanmak __construct
  • den try/except kaldırmak bu bir

    1. gibi kendi sınıf yapmak gerekecektir

      :

    $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:

    ancak sunucu uzağa gider söylersek .... sonra boynundan bir silahın bu

    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

    ama bu tüm istisnaları yakalamak değil mi? sadece MySQL Sunucusunu Kaybettik mi? – azerafati

    +1

    @Bludream Evet, ilk önce, sadece PDOException'ı yakalamalısınız (diğer istisna tipleri sorunumuz değil). İkincisi, PDOexceptions kodunun SQL sunucusunun oluşturduğu hata koduna ayarlandığını düşünüyorum. SQL server için özel kodun kontrol edilip edilmediğini kontrol edebilirsiniz (buna rağmen kendinize bakmak zorunda kalacaksınız). Son olarak, yeniden bağlanmayı denemeden önce uyumalısınız, çünkü sunucuyu yalnızca bağlantı istekleriyle karşılarsınız. Sunucu geçici bir başlangıç ​​durumundaysa (örneğin başlangıç ​​aşamasındadır) bağlantıları reddedebilir, ancak sonradan bir saniye sonra kabul edebilir. – GordonM

    İlgili konular