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