sql >> Databasteknik >  >> RDS >> Mysql

Codeigniter byter till sekundär databas om den primära är nere

Tja, jag vet inte om det här kommer att fungera, men du kan faktiskt prova det här:

1) skapa 2 grupper av databasinställningar (i 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) Ställ av deubg för att undvika att visa db-fel och faktiskt döda ditt skript (gör det för båda):

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

3) Du kan skicka en TRUE till den andra parametern medan du laddar biblioteket, så att det faktiskt har ett returvärde; det returnerar själva databasobjektet:

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

Nu kan du bara leta efter resursen "anslutnings-ID" för att se om en anslutning upprättades eller inte:

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

Nu kan du bestämma dig för att ladda en annan DB om den första inte laddas. Nackdelen är att du faktiskt inte vet varför db-anslutningen inte fungerade...

När det gäller hur du implementerar detta, kanske du vill prova att utöka databasklassen eller, bättre, skapa ditt eget bibliotek som faktiskt bara kontrollerar om en anslutning finns eller inte, och ladda detta istället för databasbiblioteket. Eftersom det returnerar ett databasobjekt (förutom när alla 2 anslutningarna misslyckas), kan du sedan arbeta med det som du skulle göra med den vanliga databasklassen:

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



  1. Hur använder jag LOAD_FILE för att infoga värde från en fil i en tabell?

  2. 4 sätt att lista alla tabeller i en MariaDB-databas

  3. Prestanda/effektivitet för 2 SELECT-satser vs UNION vs något annat i MySQL-PHP

  4. Hur hittar man distinkta kolumner i en kapslad underfråga i SQL?