簡體   English   中英

如果主數據庫關閉,則Codeigniter切換到輔助數據庫

[英]Codeigniter switch to secondary database if primary is down

我想知道是否有一種方法可以處理mysql錯誤並配置ci以在主服務器關閉(無法連接)的情況下切換到輔助DB服務器?

好吧,我不知道這是否行得通,但是您可以嘗試以下操作:

1)創建2組數據庫設置(在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)設置deubg為避免顯示db錯誤並實際上殺死腳本(對兩個腳本都這樣做):

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

3)您可以在加載庫時將TRUE傳遞給第二個參數,以便它實際上具有返回值; 它返回數據庫對象本身:

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

現在,您可以僅檢查“連接ID”資源,以查看是否已建立連接:

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

現在,您可以決定加載另一個數據庫,以防第一個數據庫不加載。 缺點是,您實際上並不知道為什么數據庫連接不起作用,但是...

至於如何實現這一點,您可能想嘗試擴展數據庫類,或者更好地,創建您自己的庫,該庫實際上只是檢查是否存在連接,然后加載該庫而不是數據庫庫。 由於它返回一個數據庫對象(除了所有兩個連接都失敗時),因此您可以像在普通數據庫類上那樣進行處理:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM