Bạn có thể có xu hướng xử lý vấn đề này bằng cách "ping" máy chủ mysql trước một truy vấn. Đây là một ý tưởng tồi. Để biết thêm về lý do, hãy kiểm tra bài đăng SO này: Tôi có nên ping máy chủ mysql trước mỗi truy vấn không?
Cách tốt nhất để xử lý sự cố là gói các truy vấn bên trong try/catch
khối và bắt bất kỳ ngoại lệ cơ sở dữ liệu nào để bạn có thể xử lý chúng một cách thích hợp. Điều này đặc biệt quan trọng trong các script kiểu daemon và / hoặc chạy lâu dài. Vì vậy, đây là một ví dụ rất cơ bản sử dụng "trình quản lý kết nối" để kiểm soát quyền truy cập vào các kết nối DB:
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
}
}
}
}
}