2009-08-21 4 views
2

Ich verwende PHP, um einen Prozess zu erstellen, der unsere Datenbank überwacht und eine Wartungsseite auf unserer Website einrichtet, wenn die Datenbank nicht verfügbar ist.Wie erkennt man eine nicht verfügbare Datenbank mit PHP-PDO?

Ich verwende PDO und Oracle.

Ich versuche, eine Datenbankverbindung zu verwenden und es einmal pro Minute abzufragen, um Leute zu warnen, wenn es ein Problem gibt. Wenn jedoch die Datenbank ausfällt, wartet das Skript 15 Minuten vor herauszufinden, dass es ein Problem gibt, so dass mein Prozess, jede Minute überprüfen, endet die aussehen wie das sollte:

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

ich per E-Mail bekommen Recht weg, anstatt 15 Minuten später. Gibt es eine Möglichkeit, eine dauerhafte Datenbankverbindung aufrecht zu erhalten, oder muss ich jedes Mal, wenn ich eine Abfrage vorbereite und ausführe, eine neue erstellen?

Hier ist ein Stück des Codes, wenn sie nützlich ist:

$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); 
} 

Antwort

3

Sie könnten nur in die Datenbank jedes Mal durch die Schleife verbinden und trennen. Dann werden Sie jede Minute Ihre Ausnahme bemerken. Sie müssen es testen, um zu sehen, ob es die Leistung negativ beeinflusst.

+0

Ja, darum habe ich mir Sorgen gemacht. –

Verwandte Themen