douza9835 2017-04-04 09:08
浏览 48
已采纳

在codeigniter中切换数据库服务器以进行读写操作。

I have done master and slave setup for my database server, so In my codigniter application what I want is to execute all write options on master server and all read operation on slave server.

Can anybody tell me how can I achieve this in codigniter version3.

Thanks.

  • 写回答

2条回答 默认 最新

  • douchun1961 2017-04-06 14:17
    关注

    What you have to update system/database/DB_Driver.php file.

    Its very simple what you have to make 3 small changes in this file.

    1) Inside Construction add your Read and Write server credentials.

            $this->server_details['local_server']['hostname'] = "localhost";
            $this->server_details['local_server']['username'] = "select_user";
            $this->server_details['local_server']['password'] = "password";       
    
            $this->server_details['live_server']['hostname'] = "192.192.223.22";  
            $this->server_details['live_server']['username'] = "write_user"; 
            $this->server_details['live_server']['password'] = "password";        
    

    2) Create New function will switch the database connection for select and write query.

     private function ebrandz_switch_db_for_read_write($sql) {               
    
           if( $this->hostname == $this->server_details['local_server']['hostname'] &&  $this->username == $this->server_details['local_server']['username'] &&  $this->password == $this->server_details['local_server']['password'] ) {    
                       //echo $sql.'<br/>';
             if(stristr($sql, 'SELECT')) {   
                                foreach($this->server_details['local_server'] as $index_key => $index_value ) { 
                                    $this->$index_key = $index_value;  
                                }             
    
                                  $this->conn_id = null;  //unset resource link 
                                  $this->initialize();   //Reinitialize connnection with new parameters                                                                                                       
    
                        } else {    
                                //die('write operation is not allowed.');
                                foreach($this->server_details['live_server'] as $index_key => $index_value ) { 
                                     $this->$index_key = $index_value;  
                                }  
                                $this->conn_id = null ; //unset resource link 
                                $this->initialize();    //Reinitialize connnection with new parameters                                                           
                        }
    
                   } else if( $this->hostname == $this->server_details['live_server']['hostname'] &&  $this->username == $this->server_details['live_server']['username']  &&  $this->password ==  $this->server_details['live_server']['password'] ) {  
    
                        if(stristr($sql, 'SELECT')) { 
                                foreach($this->server_details['local_server'] as $index_key => $index_value ) { 
                                     $this->$index_key = $index_value;  
                                }  
    
                                $this->conn_id = null ;  //unset resource link 
                                $this->initialize();     //Reinitialize connnection with new parameters      
    
                        } else {  
                                //die('write operation is not allowed.');
                                foreach($this->server_details['live_server'] as $index_key => $index_value ) { 
                                     $this->$index_key = $index_value;
                                } 
    
                                $this->conn_id = null ; //unset resource link 
                                $this->initialize();    //Reinitialize connnection with new parameters                                                           
                        }
    
                   }
    
                   //Code to re initialize the connection 
        }
    

    3) Inside Query function of this file you have to call the prevous defined function.

    // Verify table prefix and replace if necessary
        if ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre)
        {
            $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql);
        }
    
         /**
         * @author Anant Waykar
         * if query is read only then load some other database
         */
                $this->ebrandz_switch_db_for_read_write($sql);                     
          //Code to re initialize the connection 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私