2011-07-26 15 views
6

मेरी स्क्रिप्ट कई अलग-अलग कार्यों में फोर्क प्रक्रियाओं के साथ काफी परेशान हो रही हैं। जब भी pcntl_fork() कहा जाता है, तो सभी MySQL कनेक्शन खो जाते हैं। यदि मैं पीडीओ MySQL कनेक्शन पर कोई क्वेरी चलाता हूं तो मुझे त्रुटि "MySQL server has gone away" मिलती है।मैं क्वेरी चलाने से पहले त्रुटियों के लिए पीडीओ MySQL कनेक्शन कैसे देख सकता हूं?

समस्या यह है कि यह त्रुटि केवल विफल क्वेरी निष्पादन के बाद PDO::errorinfo() में दिखाई देती है। मैं क्वेरी को चलाने का प्रयास करने से पहले यह पता लगाने में सक्षम होना चाहूंगा कि MySQL सर्वर "चला गया है"। इस तरह से मैं एक पीडीओ रैपर बना सकता हूं जो ऐसी स्थितियों में मेरे लिए एक नया कनेक्शन बनाता है।

कोई विचार?

+0

त्रुटि के कारण किसी समस्या को ठीक करने के बारे में क्या है? लक्षणों को छिपाने के लिए आपको बीमारी का इलाज करने की ज़रूरत है। – zerkms

+0

फोर्किंग की त्रुटि का कारण नहीं है? क्या इसका मतलब यह नहीं है कि ** ** हर बार जब मैं कांटा तो नया कनेक्शन बनाने के लिए? – Hubro

+1

फोर्किंग समस्या का कारण होने की संभावना है। आदर्श रूप में, आपको पहले कांटा बनाना चाहिए और फिर कनेक्शन खोलना चाहिए। यदि यह संभव नहीं है, तो दस्तावेज़ों में यह टिप्पणी मदद कर सकती है: http://php.net/manual/en/function.pcntl-fork.php#70721 यह भी देखें [MySQL सर्वर चला गया है] (http: // dev .mysql.com/डॉक्टर/refman/5.5/en/gone-away.html) - विशेष रूप से फोर्किंग के बारे में रेखा। – Mike

उत्तर

2

मैं तुम्हें उदाहरण के द्वारा 2 तरीकों देना (कुछ मायनों में समान):
उदाहरण 1:

$sql = 'SELECT count(*) FROM `TABLE`;'; 
for ($i = 1; $i <= 2; $i++) { 
    try { 
     $nb = $pdo->query($sql)->fetchColumn(); 
     if (is_int($nb)) { 
      // OK 
      break; 
     } 
    } catch (PDOException $e) { 
    //Oups 
     if ($i == 1) { 
      // First time ? retry 
      $pdo = new PDO($dsn, $user, $password); 
     } else { 
      // Second time, KO 
      $nb = "(unknown)"; 
      echo 'PDO Connection failed: ' . $e->getMessage().'. '; 
     } 
    } 
} 

उदाहरण 2:

// check 
try { 
    $pdo->query('select 1;') 
    //OK 
} catch (PDOException $e) { 
    //Oups => reconnect 
    $pdo = new PDO($dsn, $user, $password); 
} 
// Should be good 
$sql = 'SELECT count(*) FROM `TABLE`;'; 
$nb = $pdo->query($sql)->fetchColumn(); 
2

जानकारी के लिए: यह एक बग कई के रूप में सूचित किया गया है समय 1, 2, 3 अब तक कोई फिक्स नहीं है (5.3.14)। एकमात्र समाधान एक बच्चे को फोर्क करने के बाद हर बार एक नया कनेक्शन करना है, और पीडीओ :: ATTR_PERSISTENT => झूठी

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