2009-08-21 3 views
2

Я использую PHP для создания процесса, который отслеживает нашу базу данных и размещает страницу обслуживания на нашем веб-сайте, если база данных не работает.Как обнаружить недоступную базу данных с помощью PHP PDO?

Я использую PDO и Oracle.

Я пытаюсь использовать одно соединение с базой данных и запрашивать его один раз в минуту, предупреждая людей, если есть проблема. Однако, если база данных идет вниз, сценарий ждет 15 минут, прежде чем выяснить, что есть проблема, так что мой процесс, который должен проверить каждую минуту заканчивает тем, как это:

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

Я хочу, чтобы получить по электронной почте прямо прочь, а не через 15 минут. Есть ли способ сделать это, поддерживая постоянное соединение с базой данных, или мне нужно создавать новый каждый раз при подготовке и выполнении запроса?

Вот кусок кода, если это полезно:

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

ответ

3

Вы можете просто подключить и отключить в базу данных каждый раз через петлю. Затем вы будете получать свое исключение каждую минуту. Вам придется протестировать его, чтобы увидеть, влияет ли это на производительность отрицательно.

+0

Да, это то, о чем я беспокоился. –