[英]Codeigniter: Will using $this->load->database() multiple times result in multiple connections?
我正在考慮從我的自動加載文件中刪除數據庫庫。 我正在緩存頁面上的所有內容,所以我不需要每次都連接到數據庫,而且我認為如果我讓 CI 連接到數據庫,這會浪費速度。
我現在的問題是:如果我在 MY_Model $this->load->database()
加載數據庫而沒有參數(它們來自配置文件),是否會為我在控制器中使用的每個模型建立一個新連接?
或者它會像只加載一次的助手一樣?
它們只加載一次。 數據庫類為您確保這一點。
不,您只會連接到一個數據庫。 您在database.php
指定的那個
但是,您可以連接到多個數據庫。 假設您在database.php
有兩個連接,如下所示:
/* FORUM */
$active_group = "forum";
$active_record = TRUE;
$db['forum']['hostname'] = "xxxxx";
$db['forum']['username'] = "xxxxx";
$db['forum']['password'] = "xxxxx";
$db['forum']['database'] = "xxxxx";
$db['forum']['dbdriver'] = "mysql";
$db['forum']['dbprefix'] = "";
$db['forum']['pconnect'] = TRUE;
$db['forum']['db_debug'] = TRUE;
$db['forum']['cache_on'] = FALSE;
$db['forum']['cachedir'] = "";
$db['forum']['char_set'] = "utf8";
$db['forum']['dbcollat'] = "utf8_general_ci";
/* TEST SITE */
$active_group = "default";
$active_record = TRUE;
$db['default']['hostname'] = "xxxxx";
$db['default']['username'] = "xxxxx";
$db['default']['password'] = "xxxxx";
$db['default']['database'] = "xxxxx";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
您可以使用以下方法調用此數據庫:
$this->db_forum = $this->CI->load->database('forum', TRUE);
像$this->db
一樣訪問 db1
和 db2 一樣$this->db_forum
您可以查看 CI 文檔以獲取更多信息: http : //ellislab.com/codeigniter/user-guide/database/connecting.html
我只是用了一個簡單的例子。
希望能幫助到你。
加載模型后,您可以使用:
$this->load->model('my_model', NULL, TRUE);
第三個參數將自行連接到數據庫。
通過查看system/core/Loader.php
發現了這一點。
在同一個文件中, $this->load->database();
如果$this->db
已經設置,則運行並在連接前返回FALSE
,所以不用擔心多個連接:
// Do we even need to load the database class?
if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db))
{
return FALSE;
}
我讓它工作起來很容易,我有一個根據登錄用戶名選擇數據庫的站點,所以我有一個“主”數據庫,其中包含動態可選數據庫的信息。 我的做法是將這段代碼放在我需要更改數據庫的地方,如下所示:
$db1['hostname'] = 'localhost';
$db1['username'] = $fila['dbusername'];
$db1['password'] = $fila['dbpass'];
$db1['database'] = $fila['dbname'];
$db1['dbdriver'] = 'mysqli';
$db1['dbprefix'] = 'ospos_';
$db1['pconnect'] = FALSE;
$db1['db_debug'] = TRUE;
$db1['cache_on'] = FALSE;
$db1['cachedir'] = '';
$db1['char_set'] = 'utf8';
$db1['dbcollat'] = 'utf8_general_ci';
$db1['swap_pre'] = '';
$db1['autoinit'] = TRUE;
$db1['stricton'] = FALSE;
$this->db->close();
$this->load->database($db1,FALSE);
如果您想在選擇數據庫后使其永久化,我建議使用會話變量並修改 autoload.php 文件,例如:
class DatabaseLoader {
public function __construct() {
$this->load();
}
public function load() {
$CI =& get_instance();
$may_db=$CI->session->userdata('may_db');
if($may_db)
{
$CI->db = $CI->load->database($may_db, TRUE);
}
else
{
$CI->db = $CI->load->database('default', TRUE);
}
}
}
並將數據庫信息添加到代碼的第一部分中的會話變量中:
$this->session->set_userdata('may_db',$db1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.