ECSHOP读写分离配置与改造(转载)

本文介绍了一种ECSHOP系统中实现数据库主从分离的方法,通过配置文件和自定义数据库连接类实现读写分离,提高系统性能。

因为前几天群里一个哥们使用ECSHOP遇到mysql访问瓶颈,简单看了下ECSHOP的主从分离 下面是转载的

以下代码仅供学习参考,不成熟的地方,还需完善。


 

config.php

<?php

$db_name   = "ecshop";

$prefix    = "ecs_";

$timezone    = "Europe/Berlin";

$cookie_path    = "/";

$cookie_domain    = "";

$session = "1440";

$_config = array();

//数据库主服务器设置, 支持多组服务器设置, 当设置多组服务器时, 则会随机使用某个服务器
$_config['master'][1]['dbhost'] = "192.168.2.175:3306";
$_config['master'][1]['dbname'] = "ecshop";
$_config['master'][1]['dbuser'] = "dragon";
$_config['master'][1]['dbpw'] = "loong";

/*
 *$_config['master'][2]['dbhost'] = "";
 *...
 */

//数据库从服务器设置( slave, 只读 ), 支持多组服务器设置, 当设置多组服务器时, 系统每次随机使用
$_config['slave'][1]['dbhost'] = "192.168.2.176:3306";
$_config['slave'][1]['dbname'] = "ecshop";
$_config['slave'][1]['dbuser'] = "ivan";
$_config['slave'][1]['dbpw'] = "loong";

$_config['slave'][2]['dbhost'] = "192.168.2.177:3306";
$_config['slave'][2]['dbname'] = "ecshop";
$_config['slave'][2]['dbuser'] = "ivan";
$_config['slave'][2]['dbpw'] = "loong";

define('EC_CHARSET','utf-8');

define('ADMIN_PATH','admin');

define('AUTH_KEY', 'this is a key');

define('OLD_AUTH_KEY', '');

define('API_TIME', '');

?>

 


初始化数据连接类

    /* 初始化数据库类  
     * 如果配置了从服务器,则初始化从库类 
    */  
    if(count($_config['slave'])) {  
        require(ROOT_PATH . 'includes/cls_mysql_slave.php');  
        $db = new cls_mysql_slave($_config);  
    }else{  
        require(ROOT_PATH . 'includes/cls_mysql.php');  
        $db = new cls_mysql($_config);  
    }  

 增加cls_mysql_slave.php从库类

[php]
<?php

require(ROOT_PATH . 'includes/cls_mysql.php');
class cls_mysql_slave extends cls_mysql
{
    var $slaveid = null;

    function set_config($config){
        if(!empty($this->config['slave'])) {
            $this->slaveid = array_rand($this->config['slave']);
        }
        parent::set_config($config);
    }

    /* 随机分配从库连接 */
    function set_slave_config() {         
        $this->settings = $this->config['slave'][$this->slaveid];
        $this->settings['charset'] = $this->config['charset'];
        $this->settings['pconnect'] = $this->config['pconnect'];
    }

    function slave_connect() {
        $this->set_slave_config();
        $dbhost = $this->settings['dbhost'];
        $dbuser = $this->settings['dbuser'];
        $dbpw = $this->settings['dbpw'];
        $dbname = $this->settings['dbname'];
        $this->connect($dbhost, $dbuser, $dbpw, $dbname);
        
    }


    function query($sql, $type = '') {
        // 如果执行查询操作,则执行从库连接
        if($this->slaveid && strtoupper(substr($sql, 0 , 6)) == 'SELECT') {
            $this->slave_connect();
        }else{
            parent::set_config($this->config);
            $dbhost = $this->settings['dbhost'];
            $dbuser = $this->settings['dbuser'];
            $dbpw = $this->settings['dbpw'];
            $dbname = $this->settings['dbname'];
            $this->connect($dbhost, $dbuser, $dbpw, $dbname);
        }
        return parent::query($sql, $type);
    }

    /* 删除失败连接*/
    function del_error_link(){
        unset($this->config['slave'][$this->slaveid]);
        $this->set_config($this->config);
        $this->set_slave_config();
        $dbhost = $this->settings['dbhost'];
        $dbuser = $this->settings['dbuser'];
        $dbpw = $this->settings['dbpw'];
        $dbname = $this->settings['dbname'];
        $this->connect($dbhost, $dbuser, $dbpw, $dbname);
    }
         
}

 

 

转载于:https://www.cnblogs.com/flashicp/archive/2012/12/14/ECSHOP%e4%bc%98%e5%8c%96.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值