2

私はPHPを使用して、データベースを監視し、データベースがダウンした場合にWebサイトにメンテナンスページを表示するプロセスを作成しています。

私はPDOとOracleを使用しています。

1つのデータベース接続を使用して、1分に1回クエリを実行し、問題が発生した場合にユーザーに警告しようとしています。ただし、データベースがダウンした場合、スクリプトは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);
}
4

1 に答える 1

3

ループを介して毎回データベースに接続および切断することができます。その後、毎分例外をキャッチします。ただし、パフォーマンスに悪影響を与えるかどうかをテストする必要があります。

于 2009-08-21T00:52:30.840 に答える