Mysql
 sql >> Base de données >  >> RDS >> Mysql

Codeigniter bascule vers la base de données secondaire si la principale est en panne

Eh bien, je ne sais pas si cela va fonctionner, mais vous pouvez réellement essayer ceci :

1) créez 2 groupes de paramètres de base de données (dans 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) Désactivez deubg pour éviter d'afficher les erreurs de base de données et de tuer votre script (faites-le pour les deux) :

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

3) Vous pouvez passer TRUE au deuxième paramètre lors du chargement de la bibliothèque, afin qu'il ait réellement une valeur de retour ; il renvoie l'objet de la base de données lui-même :

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

Maintenant, vous pouvez simplement vérifier la ressource "ID de connexion" pour voir si une connexion a été établie ou non :

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

Vous pouvez maintenant décider de charger une autre base de données au cas où la première ne se chargerait pas. L'inconvénient est que vous ne savez pas vraiment pourquoi la connexion à la base de données n'a pas fonctionné, cependant...

Quant à la façon d'implémenter cela, vous voudrez peut-être essayer d'étendre la classe de base de données ou, mieux, créer votre propre bibliothèque qui, en fait, vérifie simplement si une connexion existe ou non, et la charge à la place de la bibliothèque de base de données. Puisqu'il renvoie un objet de base de données (sauf lorsque les 2 connexions échouent), vous pouvez alors travailler dessus comme vous le feriez sur la classe de base de données normale :

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