如何在codeigniter中避免过多和不必要的数据库连接

时间:2014-10-19 12:12:13

标签: php codeigniter

在流行的PHP框架CodeIgniter中,我们通常会像这样进行过多且不必要的数据库连接(基本上使用主从模式,因此我无法使用CI的数据库自动加载):

我有一个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继承,如

class User_Model extends MY_Model
{
    public function __construct(){
        parent::__construct();
        $this->load->model(other_model);
    }
}

但我发现每次在控制器中加载模型或在模型中加载其他模型时,它都会 执行MY_Model的构造函数,因此它可以创建大量的垃圾数据库连接,它非常糟糕。

2 个答案:

答案 0 :(得分: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;
}

我们可以通过$ this-> db_write和$ this-> db_read访问我在这里声明的这两个属性。 希望这篇文章让你放松,谁也遇到这个问题,如果有人有其他方法来解决这个问题,请在这篇文章中评论,我是 很高兴了解你的决心:)

答案 1 :(得分:-3)

您可以使用

    $this->db->close();

获取数据并重新连接后,您可以使用

    $this->db->reconnect();

你可以参考这个page