[英]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_write
和db_read
,因为该实例是全局有效的,因此这种方式可以避免不必要的数据库连接。
并导致CI_Model的魔术函数__get
function __get($key)
{
$CI =& get_instance();
return $CI->$key;
}
我们可以通过$ this-> db_write和$ this-> db_read访问在此声明的这两个属性。 希望这篇文章使您也遇到这个问题的人放松下来,如果有人有其他解决此问题的方法,请在这篇文章中发表评论,我很高兴学习您的解决方法:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.