Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Codeigniter wechselt zur sekundären Datenbank, wenn die primäre ausgefallen ist

Nun, ich weiß nicht, ob das funktionieren wird, aber Sie können Folgendes versuchen:

1) Erstellen Sie 2 Gruppen von Datenbankeinstellungen (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) Schalten Sie deubg aus, um zu vermeiden, dass DB-Fehler angezeigt werden und Ihr Skript tatsächlich beendet wird (tun Sie es für beide):

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

3) Sie können dem zweiten Parameter beim Laden der Bibliothek ein TRUE übergeben, damit er tatsächlich einen Rückgabewert hat; es gibt das Datenbankobjekt selbst zurück:

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

Jetzt können Sie einfach nach der Ressource "Verbindungs-ID" suchen, um zu sehen, ob eine Verbindung hergestellt wurde oder nicht:

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

Jetzt können Sie entscheiden, eine andere DB zu laden, falls die erste nicht geladen wird. Der Nachteil ist, dass Sie nicht wirklich wissen, warum die DB-Verbindung nicht funktioniert hat ...

Um dies zu implementieren, sollten Sie versuchen, die Datenbankklasse zu erweitern, oder besser eine eigene Bibliothek erstellen, die tatsächlich nur prüft, ob eine Verbindung besteht oder nicht, und diese anstelle der Datenbankbibliothek laden. Da es ein Datenbankobjekt zurückgibt (außer wenn alle 2 Verbindungen fehlschlagen), können Sie daran arbeiten, wie Sie es mit der normalen Datenbankklasse tun würden:

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;
          }
        }
      }