繁体   English   中英

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

[英]how to avoid excessive and unnecessary db connections in codeigniter

在流行的PHP框架CodeIgniter中,我们通常会这样进行过多和不必要的db连接(基本上在使用主从模式时使用,因此我无法使用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的构造函数,因此它会造成很多浪费的数据库连接,这是如此可怕。

然后,我查看了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访问在此声明的这两个属性。 希望这篇文章使您也遇到这个问题的人放松下来,如果有人有其他解决此问题的方法,请在这篇文章中发表评论,我很高兴学习您的解决方法:)

您可以使用

    $this->db->close();

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

    $this->db->reconnect();

你可以参考这个页面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM