2011-07-28 14 views
6

मैं इस वर्ग को अपवाद को पकड़ने के लिए कैसे संशोधित कर सकता हूं जहां MySQL सर्वर दूर जाता है, और फिर से कनेक्ट होता है?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

ले लो गर्दन से एक बंदूक के बेटे की तरह ख़ाली हो सकता है और उसे घर ला सकते हैं। लेकिन गंभीरता से, क्या मैं पीडीओ ऑब्जेक्ट को फिर से शुरू करके पुन: कनेक्ट नहीं कर सकता? मुझे लगता है कि मुख्य सवाल यह है कि क्वेरी पकड़ने और विधियों को निष्पादित करने के लिए एक हुक कैसे सेट करें। – HyderA

उत्तर

3

आप शायद आप इस तरह डीबी तो कनेक्ट यह एक

  1. की तरह अपने ही वर्ग बनाने के लिए से __construct
  2. try/except हटाने की आवश्यकता होगी:
$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); 
} 
+1

लेकिन क्या यह सभी अपवादों को पकड़ नहीं रहा है ?? क्या हमें केवल 'MySQL सर्वर को दूर नहीं किया जाना चाहिए'? – azerafati

+1

@ ब्लड्रीम हाँ मैं सहमत हूं, सबसे पहले, आपको केवल पीडीओएक्सप्शन को पकड़ना चाहिए (अन्य अपवाद प्रकार हमारी समस्या नहीं हैं)। दूसरा, मेरा मानना ​​है कि PDOexceptions पर कोड SQL सर्वर उत्पन्न त्रुटि कोड पर सेट है। आप SQL सर्वर के लिए विशिष्ट कोड की जांच कर सकते हैं (हालांकि आपको इसे स्वयं देखना होगा)। अंत में, आपको दोबारा जुड़ने का प्रयास करने से पहले सोना चाहिए क्योंकि आप केवल कनेक्शन अनुरोधों के साथ सर्वर को हथियार देंगे। यदि सर्वर एक क्षणिक शुरुआत में है (उदाहरण के लिए यह शुरू करने की प्रक्रिया में है) तो यह कनेक्शन से इनकार कर सकता है लेकिन उन्हें बाद में स्वीकार कर सकता है। – GordonM

संबंधित मुद्दे