在流行的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的构造函数,因此它可以创建大量的垃圾数据库连接,它非常糟糕。
答案 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_write
和db_read
,因为此实例是全局有效的
所以这种方式可以避免不必要的数据库连接。
并导致CI_Model的魔术函数__get
function __get($key)
{
$CI =& get_instance();
return $CI->$key;
}
我们可以通过$ this-> db_write和$ this-> db_read访问我在这里声明的这两个属性。 希望这篇文章让你放松,谁也遇到这个问题,如果有人有其他方法来解决这个问题,请在这篇文章中评论,我是 很高兴了解你的决心:)
答案 1 :(得分:-3)