आप किसी क्वेरी से पहले mysql सर्वर को "पिंग" करके इस समस्या को संभालने के इच्छुक हो सकते हैं। यह विचार अच्छा नहीं है। इस बारे में अधिक जानने के लिए, इस SO पोस्ट की जाँच करें:>क्या मुझे प्रत्येक क्वेरी से पहले mysql सर्वर को पिंग करना चाहिए?
समस्या से निपटने का सबसे अच्छा तरीका है try/catch
. के अंदर प्रश्नों को लपेटना किसी भी डेटाबेस अपवाद को ब्लॉक करना और पकड़ना ताकि आप उन्हें उचित रूप से संभाल सकें। यह लंबे समय तक चलने वाली और/या डेमॉन प्रकार की स्क्रिप्ट में विशेष रूप से महत्वपूर्ण है। तो, डीबी कनेक्शन तक पहुंच को नियंत्रित करने के लिए "कनेक्शन मैनेजर" का उपयोग करके यहां एक बहुत ही बुनियादी उदाहरण दिया गया है:
class DbPool {
private $connections = array();
function addConnection($id, $dsn) {
$this->connections[$id] = array(
'dsn' => $dsn,
'conn' => null
);
}
function getConnection($id) {
if (!isset($this->connections[$id])) {
throw new Exception('Invalid DB connection requested');
} elseif (isset($this->connections[$id]['conn'])) {
return $this->connections[$id]['conn'];
} else {
try {
// for mysql you need to supply user/pass as well
$conn = new PDO($dsn);
// Tell PDO to throw an exception on error
// (like "MySQL server has gone away")
$conn->setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
$this->connections[$id]['conn'] = $conn;
return $conn;
} catch (PDOException $e) {
return false;
}
}
}
function close($id) {
if (!isset($this->connections[$id])) {
throw new Exception('Invalid DB connection requested');
}
$this->connections[$id]['conn'] = null;
}
}
class Crawler {
private $dbPool;
function __construct(DbPool $dbPool) {
$this->dbPool = $dbPool;
}
function crawl() {
// craw and store data in $crawledData variable
$this->save($crawledData);
}
function saveData($crawledData) {
if (!$conn = $this->dbPool->getConnection('write_conn') {
// doh! couldn't retrieve DB connection ... handle it
} else {
try {
// perform query on the $conn database connection
} catch (Exception $e) {
$msg = $e->getMessage();
if (strstr($msg, 'MySQL server has gone away') {
$this->dbPool->close('write_conn');
$this->saveData($val);
} else {
// some other error occurred
}
}
}
}
}