当前位置:Gxlcms > 数据库问题 > CodeIgniter 3.0支持数据库读写分离方式

CodeIgniter 3.0支持数据库读写分离方式

时间:2021-07-01 10:21:17 帮助过:36人阅读

= ‘default‘; $query_builder = TRUE; $db[‘default‘] = array( ‘dsn‘ => ‘‘, ‘hostname‘ => ‘127.0.0.1‘, ‘username‘ => ‘root‘, ‘password‘ => ‘‘, ‘database‘ => ‘xxx‘, ‘dbdriver‘ => ‘mysqli‘, ‘dbprefix‘ => ‘‘, ‘pconnect‘ => FALSE, ‘db_debug‘ => 1, ‘cache_on‘ => FALSE, ‘cachedir‘ => ‘‘, ‘char_set‘ => ‘utf8‘, ‘dbcollat‘ => ‘utf8_general_ci‘, ‘swap_pre‘ => ‘‘, ‘encrypt‘ => FALSE, ‘compress‘ => FALSE, ‘stricton‘ => FALSE, //failover 配置备用节点 ‘failover‘ => array( /* 设置多个备用数据库主机 * array( ‘hostname‘ => ‘localhost1‘, ‘username‘ => ‘‘, ‘password‘ => ‘‘, ‘database‘ => ‘‘, ‘dbdriver‘ => ‘mysqli‘, ‘dbprefix‘ => ‘‘, ‘pconnect‘ => TRUE, ‘db_debug‘ => TRUE, ‘cache_on‘ => FALSE, ‘cachedir‘ => ‘‘, ‘char_set‘ => ‘utf8‘, ‘dbcollat‘ => ‘utf8_general_ci‘, ‘swap_pre‘ => ‘‘, ‘encrypt‘ => FALSE, ‘compress‘ => FALSE, ‘stricton‘ => FALSE ), array( ‘hostname‘ => ‘localhost2‘, ‘username‘ => ‘‘, ‘password‘ => ‘‘, ‘database‘ => ‘‘, ‘dbdriver‘ => ‘mysqli‘, ‘dbprefix‘ => ‘‘, ‘pconnect‘ => TRUE, ‘db_debug‘ => TRUE, ‘cache_on‘ => FALSE, ‘cachedir‘ => ‘‘, ‘char_set‘ => ‘utf8‘, ‘dbcollat‘ => ‘utf8_general_ci‘, ‘swap_pre‘ => ‘‘, ‘encrypt‘ => FALSE, ‘compress‘ => FALSE, ‘stricton‘ => FALSE )*/ ), ‘save_queries‘ => TRUE ); //开启 $db[‘write‘] 支持读写分离 $db[‘write‘] = array( ‘dsn‘ => ‘‘, ‘hostname‘ => ‘127.0.0.1‘, ‘username‘ => ‘root‘, ‘password‘ => ‘‘, ‘database‘ => ‘xxx‘, ‘dbdriver‘ => ‘mysqli‘, ‘dbprefix‘ => ‘‘, ‘pconnect‘ => FALSE, ‘db_debug‘ => 1, ‘cache_on‘ => FALSE, ‘cachedir‘ => ‘‘, ‘char_set‘ => ‘utf8‘, ‘dbcollat‘ => ‘utf8_general_ci‘, ‘swap_pre‘ => ‘‘, ‘encrypt‘ => FALSE, ‘compress‘ => FALSE, ‘stricton‘ => FALSE, //failover 配置备用节点 ‘failover‘ => array(), ‘save_queries‘ => TRUE );

步骤二、修改 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   

人气教程排行