2011-07-28 11 views
6

¿Cómo puedo modificar esta clase para detectar excepciones donde el servidor MySQL se va y reconectar?La reconexión en el servidor MySQL se ha ido

<?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 hijo de un arma de fuego por el cuello y traerlo a casa. Pero en serio, ¿no debería ser capaz de volver a conectar reiniciando el objeto PDO? La pregunta clave que creo es cómo configurar un gancho para atrapar los métodos de consulta y ejecución. – HyderA

Respuesta

3

es probable que necesite para hacer su propia clase como éste

  1. eliminar try/except de __construct
  2. luego conectar a que DB como esto:
$conn = null; 
$limit = 10; 
$counter = 0; 
while (true) { 
    try { 
    $conn = DBConn(); 
    break; 
    } 
    catch (Exception $e) { 
    $conn = null; 
    $counter++; 
    if ($counter == $limit) 
     throw $e; 
    } 

}

EDITAR 1:

pero si usted dice que su servidor desaparece .... entonces puede ser algo bajo como esto

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

pero ¿no es esto atrapar todas las excepciones? ¿no deberíamos solo atrapar '' El servidor MySQL se ha ido'' – azerafati

+1

@Bludream Sí, estoy de acuerdo, primero, solo debería detectar la excepción PDO (otros tipos de excepciones no son nuestro problema). En segundo lugar, creo que el código en PDOexceptions está configurado en el código de error generado por el servidor SQL. Puedes verificar que el código específico para SQL Server se haya ido (aunque tendrás que buscarlo tú mismo). Finalmente, debes dormir antes de intentar reconectarte porque simplemente presionarás al servidor con solicitudes de conexión. Si el servidor tiene un inicio transitorio (por ejemplo, está en proceso de inicio), puede rechazar las conexiones pero aceptarlas un segundo después. – GordonM

Cuestiones relacionadas