Mysql
 sql >> Database >  >> RDS >> Mysql

Codeigniter passa al database secondario se primario è inattivo

Bene, non so se funzionerà, ma puoi effettivamente provare questo:

1) creare 2 gruppi di impostazioni del database (in application/config/database.php):

// regular one..
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
//...

// second connection
$db['second']['hostname'] = 'localhost';
$db['second']['username'] = 'root';
//...

2) Disattiva deubg per evitare di mostrare errori db e di uccidere effettivamente il tuo script (fallo per entrambi):

$db['default']['db_debug'] = FALSE;

3) Puoi passare un TRUE al secondo parametro durante il caricamento della libreria, in modo che abbia effettivamente un valore di ritorno; restituisce l'oggetto database stesso:

$dbobject1 = $this->load->database('default',TRUE);
$dbobject2 = $this->load->database('second',TRUE);

Ora puoi semplicemente controllare la risorsa "ID connessione" per vedere se è stata stabilita una connessione o meno:

if(FALSE === $dbobject1->conn_id)
{
  echo 'No connection established!';
}

Ora puoi decidere di caricare un altro DB nel caso in cui il primo non si carichi. Il rovescio della medaglia è che non sai effettivamente perché la connessione db non ha funzionato, però...

Per quanto riguarda come implementarlo, potresti provare ad estendere la classe del database o, meglio, creare la tua libreria che in realtà controlla solo se esiste o meno una connessione e carica questa invece della libreria del database. Poiché restituisce un oggetto database (a parte quando tutte e 2 le connessioni falliscono), puoi quindi lavorarci come faresti con la normale classe database:

class Check_db {

     private $CI = '';
     public $DB1 = '';
     public $DB2 = '';

     function __construct()
     {
        $this->CI =&get_instance();
        $this->DB1 = $this->CI->load->database('default',TRUE);
        if(FALSE !== $this->DB1->conn_id)
        {
          return $this->DB1;
        }
        else
        {
          $this->DB2 = $this->CI->load->database('second',TRUE);
          if(FALSE !== $this->DB2->conn_id)
          {
            return $this->DB2;
          }
          else
          {
            return FALSE;
          }
        }
      }