步骤二、修改 system/core/Controller.php 加入下列代码
public $db_write = null;
步骤三、修改system/database/DB.php
找到
$DB->initialize();
在上面加入
//支持 读写分离 if (!empty($db[‘write‘])){ $CI =& get_instance(); $CI->db_write = new $driver($db[‘write‘]); $DB->is_single_instance = false; $CI->db_write->is_single_instance = false; $CI->db_write->initialize(); }else{ $DB->is_single_instance = true; }
步骤四、修改 system/database/DB_driver.php
添加对SQL的数据库连接选择路由功能。
添加实例变量
public $is_single_instance = false;
并替换下面的方法
public function simple_query($sql) { if ( ! $this->conn_id) { $this->initialize(); } if($this->is_single_instance){ //不读写分离 return $this->_execute($sql); }else{ //读写分离 if(preg_match("/^\s*select/",strtolower($sql))) { return $this->_execute($sql); } else { $CI =& get_instance(); //默认选择主库!这点很重要,如果有未知功能也可以保证数据完整 $rrr = $CI->db_write->_execute($sql); return $rrr; } } }
第五骤:如果是使用默认的 mysqli连接,请注释掉 system/database/drivers/mysqli/mysqli_driver.php 的下面方法
public function insert_id(){
return $this->conn_id->insert_id;
}
并在 system/database/DB_driver.php 里面新增下方法
/** * Insert ID * * @return int */ public function insert_id() { //return $this->conn_id->insert_id; if($this->is_single_instance){ return $this->conn_id->insert_id; }else{ //读写分离 $CI =& get_instance(); return $CI->db_write->conn_id->insert_id; } }
第六步:修改 system/database/DB_driver.php 里面的 close方法
/** * Close DB Connection * * @return void */ public function close() { if($this->is_single_instance){ if ($this->conn_id) { $this->_close(); $this->conn_id = FALSE; } }else{ //读写分离 $CI =& get_instance(); $CI->db_write->conn_id = FALSE; $this->conn_id = FALSE; } }
至此,CodeIgniter 3.0 完美的解决了 读写分离的操作
本文参考了部分网上的资源
CodeIgniter 3.0支持数据库读写分离方式
标签:多个 注释 功能 mysql drivers 读写分离 pre function oid