2009-08-21 4 views
2

J'utilise PHP pour créer un processus qui surveille notre base de données et met en place une page de maintenance sur notre site Web si la base de données est en panne. J'utilise PDO et Oracle.Comment détecter une base de données indisponible avec PHP PDO?

J'essaie d'utiliser une connexion à une base de données et l'interroger une fois par minute, alertant les gens en cas de problème. Toutefois, si la base de données tombe en panne, le script attend 15 minutes avant de déterminer qu'il ya un problème, donc mon processus qui est censé vérifier chaque minute finit par ressembler à ceci:

06:56:46: SUCCESS -- I take down the database after this success 
07:12:48: FAILURE - sent email 
07:13:48: FAILURE 
... 

Je veux recevoir un courriel droit loin, plutôt que 15 minutes plus tard. Est-il possible de maintenir cette connexion à une base de données persistante ou dois-je en créer une nouvelle chaque fois que je prépare et exécute une requête?

est ici un morceau de code, s'il est utile:

$last_email_time = null; // the time of the last error email sent 
$db_conn = null; 
$script_start_time = time(); 

while(true) { 
    $success = false; 

    // attempt to create a database connection 
    if(!$db_conn) { 
     try { 
      $db_connection_data = $g_pdo_connection_data['freedom']; 
      $db_conn = new PDO($db_connection_data['string'], $db_connection_data['user'], $db_connection_data['password']); 
      $db_conn->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $db_conn->setAttribute (PDO::ATTR_TIMEOUT, 60); 
      if(!$db_conn) { 
       throw new Exception("Unable to create a database connection"); 
      } 
     } catch(Exception $e) { 
      $last_email_time = handle_error($last_email_time, $e->getMessage()); 
      $db_conn = null; 
     } 
    } 

    // attempt a query 
    if($db_conn) { 
     try { 
      $q = $db_conn->prepare("SELECT 1 FROM DUAL"); 
      $q->execute(); 
      $q->closeCursor(); 
      if(!$q) { 
       throw new Exception("Unable to query the database"); 
      } 
      $success = true; 
     } catch(Exception $e) { 
      $last_email_time = handle_error($last_email_time, $e->getMessage()); 
     } 
    } 

    // remove the maintenance page if we were successful, else clear the connection 
    if($success) { 
     handle_success(); 
     $last_email_time = null; 
    } else { 
     $db_conn = null; 
    } 

    flush(); 
    if(ob_get_contents() != '') { 
     ob_flush(); 
    } 
    sleep(60); 
} 

Répondre

3

Vous pouvez simplement connecter et déconnecter la base de données à chaque fois dans la boucle. Ensuite, vous attraperez votre exception à chaque minute. Vous devrez le tester pour voir si cela affecte négativement les performances.

+0

Oui, c'est ce qui m'inquiétait. –

Questions connexes