簡體   English   中英

Codeigniter:多次使用 $this->load->database() 會導致多個連接嗎?

[英]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.

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