sql >> Base de Datos >  >> RDS >> Mysql

Codeigniter cambia a la base de datos secundaria si la principal está inactiva

Bueno, no sé si esto va a funcionar, pero puedes probar esto:

1) cree 2 grupos de configuraciones de base de datos (en 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) Desactive la depuración para evitar mostrar errores de db y matar su secuencia de comandos (hágalo para ambos):

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

3) Puede pasar un VERDADERO al segundo parámetro mientras carga la biblioteca, para que realmente tenga un valor de retorno; devuelve el propio objeto de la base de datos:

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

Ahora, puede verificar el recurso "ID de conexión" para ver si se estableció una conexión o no:

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

Ahora puede decidir cargar otra base de datos en caso de que la primera no se cargue. Sin embargo, la desventaja es que no sabes por qué la conexión db no funcionó...

En cuanto a cómo implementar esto, es posible que desee intentar extender la clase de la base de datos o, mejor, crear su propia biblioteca que, de hecho, solo verifica si existe una conexión o no, y cargar esto en lugar de la biblioteca de la base de datos. Dado que devuelve un objeto de base de datos (excepto cuando fallan las 2 conexiones), puede trabajar en eso como lo haría en la clase de base de datos normal:

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