【问题标题】:Codeigniter: Will using $this->load->database() multiple times result in multiple connections?Codeigniter:多次使用 $this->load->database() 会导致多个连接吗?
【发布时间】:2013-07-02 07:38:35
【问题描述】:

我正在考虑从我的自动加载文件中删除数据库库。我正在缓存页面上的所有内容,因此我不需要每次都连接到数据库,我认为如果我让 CI 连接到数据库,那是在浪费速度。

我现在的问题是:如果我例如在 MY_Model $this->load->database() 中加载数据库,不带参数(它们来自配置文件),是否会为我在控制器中使用的每个模型建立新连接?

还是会像只加载一次的助手?

【问题讨论】:

    标签: php database performance codeigniter connection


    【解决方案1】:

    它们只加载一次。数据库类会为您确保这一点。

    【讨论】:

    • 太棒了,这就是我想听到的。这在任何地方都有记录吗?
    • 是的,我正在寻找那个。
    • 检查329 中的system/core/Loader.php 行。我的答案中有更多详细信息。
    【解决方案2】:

    不,您只会连接到一个数据库。你在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

    我只是用了一个简单的例子。

    希望对你有帮助。

    【讨论】:

    • 我用同样的方式连接,但是对于 db2 $this->db_forum 在其他模型中出现错误,我需要在我的所有模型中连接到数据库 db2 吗?
    【解决方案3】:

    加载模型后,您可以使用:

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

    【讨论】:

      【解决方案4】:

      我让它工作起来很容易,我有一个根据登录用户名选择数据库的站点,所以我有一个包含动态可选数据库信息的“主”数据库。我的做法是将此代码放置在我需要更改数据库的位置,如下所示:

      $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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-30
        • 2011-08-11
        相关资源
        最近更新 更多