Php 如何避免codeigniter中过度和不必要的db连接
在流行的PHP framework CodeIgniter中,我们通常会进行过多和不必要的数据库连接,如下图所示(基本上处于主从模式,因此我不能使用CI的自动加载数据库): 我有一个CI_模型的子类Php 如何避免codeigniter中过度和不必要的db连接,php,codeigniter,Php,Codeigniter,在流行的PHP framework CodeIgniter中,我们通常会进行过多和不必要的数据库连接,如下图所示(基本上处于主从模式,因此我不能使用CI的自动加载数据库): 我有一个CI_模型的子类 class MY_Model extends CI_Model { $this->db_write = null; $this->db_read = null; public function __construct() { if(empt
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_模型,如
class User_Model extends MY_Model
{
public function __construct(){
parent::__construct();
$this->load->model(other_model);
}
}
但我发现每次我在控制器中加载一个模型或在模型中加载其他模型时,它都会
执行MY_Model的构造函数,这样会造成大量的数据库连接浪费,这太糟糕了。您可以使用
$this->db->close();
获取数据并重新连接后,您可以使用
$this->db->reconnect();
你可以参考这个然后我查看了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\u instance
将获取CI控制器实例的引用,我将主连接和从连接对象分配给它的属性db\u write
和db\u read
,因为这个实例是全局有效的
因此,这种方法可以避免不必要的数据库连接
并使CI_模型的魔法函数
function __get($key)
{
$CI =& get_instance();
return $CI->$key;
}
我们可以通过$this->db\u write和$this->db\u read访问我在这里声明的这两个属性。
希望这篇文章能让同样遇到这个问题的人放松,如果有人有其他方法来解决这个问题,请在这篇文章中发表评论,我很抱歉
很高兴了解你的决心:)