2009-08-21 48 views
2

我正在使用PHP創建一個進程來監視我們的數據庫,並在數據庫關閉時在我們的網站上放置一個維護頁面。如何使用PHP PDO檢測不可用的數據庫?

我正在使用PDO和Oracle。

我想使用一個數據庫連接並每分鐘查詢一次,提醒人們是否有問題。

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

我想得對電子郵件:但是,如果數據庫出現故障,該腳本搞清楚,有一個問題,所以我的過程,應該檢查每分鐘結束這樣看之前等待15分鐘而不是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

是的,這就是我所擔心的。 – 2009-08-21 02:06:02