PHP PDO kullanarak bir veritabanı kullanılamaz algılamak nasıl?

1 Cevap php

Ben bizim veritabanı izler ve veritabanı aşağı ise sitemizde bakım sayfasını koyar bir süreç oluşturmak için PHP kullanıyorum.

Ben PDO ve Oracle kullanıyorum.

Ben bir sorun varsa insanları uyarmak, bir veritabanı bağlantısını kullanın ve bir kez bir dakika onu sorgulamak için çalışıyorum. Veritabanı aşağı giderse Ancak, komut bir sorun olduğunu bulmaktan önce 15 dakika bekler, bu yüzden her dakika kontrol etmek gerekiyordu benim süreci bu gibi bakarak biter:

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

Ben yerine 15 dakika sonra, hemen e-posta almak istiyorum. Bir kalıcı veritabanı bağlantısı korumak veya ben bir yenisini ben hazırlamak her zaman oluşturmak ve bir sorgu çalıştırmak zorunda bunu yapmak için herhangi bir yolu var mı?

Yararlı eğer burada bir kod grubudur, bulunuyor:

$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 Cevap

Sadece bağlayın ve döngü veritabanına her zaman ayırın olabilir. Sonra her dakika sizin özel durum yakalayacağız. Bunu olumsuz olsa performansını etkilediğini görmek için bunu test etmek gerekir.