2011-07-28 44 views
6

Làm cách nào tôi có thể sửa đổi lớp này để bắt ngoại lệ khi Máy chủ MySQL Chuyển đi và kết nối lại?Kết nối lại trên Máy chủ MySQL đã Biến mất

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

Grab con trai của một khẩu súng bằng cổ và mang anh ta về nhà. Nhưng nghiêm túc, tôi không thể kết nối lại bằng cách khởi tạo lại đối tượng PDO? Câu hỏi quan trọng tôi nghĩ là làm thế nào để thiết lập một móc để bắt truy vấn và thực hiện các phương pháp. – HyderA

Trả lời

3

có thể bạn sẽ cần phải thực hiện lớp học của riêng bạn như thế này một

  1. loại bỏ try/except từ __construct
  2. sau đó kết nối với bạn DB như thế này:
$conn = null; 
$limit = 10; 
$counter = 0; 
while (true) { 
    try { 
    $conn = DBConn(); 
    break; 
    } 
    catch (Exception $e) { 
    $conn = null; 
    $counter++; 
    if ($counter == $limit) 
     throw $e; 
    } 

}

CHỈNH SỬA 1:

nhưng nếu bạn nói rằng máy chủ của bạn sẽ biến mất .... sau đó có thể smth như thế này

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

nhưng không phải là bắt tất cả ngoại lệ này sao ?? không nên chúng tôi chỉ bắt 'MySQL Server đã đi xa '?? – azerafati

+1

@ Bludream Vâng, tôi đồng ý, trước tiên, bạn chỉ nên nắm bắt PDOException (các loại ngoại lệ khác không phải là vấn đề của chúng tôi). Thứ hai, tôi tin rằng mã trên PDOexceptions được đặt thành mã lỗi máy chủ SQL được tạo ra. Bạn có thể kiểm tra mã cụ thể cho máy chủ SQL đã biến mất (bạn sẽ phải tự mình tìm kiếm). Cuối cùng, bạn nên ngủ trước khi thử kết nối lại vì bạn sẽ chỉ đập máy chủ với các yêu cầu kết nối. Nếu máy chủ đang ở trạng thái khởi động tạm thời (ví dụ: trong quá trình khởi động), máy chủ có thể từ chối kết nối nhưng chấp nhận chúng sau một giây. – GordonM

Các vấn đề liên quan