2014-10-19 57 views
0

在流行的PHP框架CodeIgniter中,我們通常會做出過多和不必要的db連接(基本上使用主從模式,所以我不能使用CI的數據庫自動加載):如何避免codeigniter中過度和不必要的數據庫連接

我有CI_Model的一個子類

class MY_Model extends CI_Model 
{ 
    $this->db_write = null; 
    $this->db_read = null; 
    public function __construct() 
    { 
     if(empty($this->db_write) || empty($this->db_read)) { 
      $this->db_write = $this->load->database('master', true); 
      $this->db_read = $this->load->database('slave', true); 
     } 
    } 
} 

}

等車型從這個MY_Model像

繼承210

但我發現每次我在控制器中加載模型或在模型中加載其他模型時,都會執行MY_Model的構造函數,因此它可能會造成很多浪費數據庫連接,這非常可怕。

回答

0

然後我看着CI的功能,以自動加載數據庫,我發現了這個問題的解決方案。

class MY_Model extends CI_Model 
{ 
    public function __construct() 
    { 
     $CI = &get_instance(); 
     if(empty($CI->db_write) || empty($CI->db_read)) { 
      $CI->db_write = $this->load->database('master', true); 
      $CI->db_read = $this->load->database('slave', true); 
     } 
    } 
} 

$CI = &get_instance會得到CI控制器的實例的引用,我指定主從連接對象到它的財產db_writedb_read,因爲這種情況下是全局性 所以這樣可以避免不必要的數據庫連接。

,並導致CI_Model的神奇功能__get

function __get($key) 
{ 
    $CI =& get_instance(); 
    return $CI->$key; 
} 

我們可以通過這個 - $> db_write和$這個 - > db_read訪問我宣佈在這裏這兩個屬性。 希望這篇文章讓你放鬆誰也會遇到這個問題,如果有人有其他方法可以解決這個問題,請在這篇文章中發表評論,我很高興爲你解析:)

-2

可以獲取數據後,使用

$this->db->close(); 

,並重新連接你可以使用

$this->db->reconnect(); 

U可以參考這個page