Как обнаружить недоступную базу данных с помощью PHP PDO? - PullRequest
2 голосов
/ 21 августа 2009

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

Я использую 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);
}

1 Ответ

3 голосов
/ 21 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...