Я использую 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);
}
Да, это то, о чем я беспокоился. –