discuz mysql 读写分离_Discuz X2 读写分离的配置及分析

在 Discuz! X 版本 程序里面内置了读写分离的功能,方便了一些负载比较大的站点使用来降低一定的负载。

Discuz! X 2.0 默认未开启此功能,需要在配置文件中做相应的修改此功能才会开启生效。

在配置开启读写分离的之前需要在服务器上先配置好 mysql 的主从

下面介绍一下 X2 读写分离的配置:

X2 的读写分离只需要在 ./config/config_global.php 文件中加入,以下的内容即可

$_config[‘db’][‘slave’] = array();

$_config[‘db’][‘slave’][‘1’][‘dbhost’] = ‘10.0.4.162’;  //mysql 从库的 host

$_config[‘db’][‘slave’][‘1’][‘dbuser’] = ‘formaster’;   //mysql 从库的数据库用户名

$_config[‘db’][‘slave’][‘1’][‘dbpw’] = ‘****’;    //mysql 从库的数据库密码

$_config[‘db’][‘slave’][‘1’][‘dbcharset’] = ‘gbk’;

$_config[‘db’][‘slave’][‘1’][‘pconnect’] = ‘0’;

$_config[‘db’][‘slave’][‘1’][‘dbname’] = ‘ultrax’; //mysql 从库的数据库名

$_config[‘db’][‘slave’][‘1’][‘tablepre’] = ‘pre_’;

//如果有多台从库可以继续添加

//$_config[‘db’][‘slave’][‘2’][‘dbhost’] = ‘xxx’;

//$_config[‘db’][‘slave’][‘2’][‘dbuser’] = ‘xxxxxx’;

//…

$_config[‘db’][‘common’][‘slave_except_table’] = ”;  //以逗句分离的表名,表示此处设置的表仅从主服务器读写, 不使用从服务器读取

在 X2 的程序中每个入口文件都会先执行 $discuz->init(); 在该方法里中调用的 内部方法 _init_db()

function _init_db() {

$class = ‘db_mysql’;

if(count(getglobal(‘config/db/slave’))) {

require_once libfile(‘class/mysql_slave’);

$class = ‘db_mysql_slave’;

}

$this->db = & DB::object($class);

$this->db->set_config($this->config[‘db’]);

$this->db->connect();

}

会先 count(getglobal(‘config/db/slave’)) 判断 config_global.php 中是否配置了 slave

如果配置了则会调用 ./source/class/class_mysql_slave.php 文件中的 db_mysql 的子类 db_mysql_slave 代替 db_mysql

当程序执行 query 时 调到 db_mysql_slave 的 query 方法

function query($sql, $type = ”) {

if($this->slaveid && !$this->slaveexcept && strtoupper(substr($sql, 0 , 6)) == ‘SELECT’) {

$this->slave_connect();

}

$this->slaveexcept = false;

return parent::query($sql, $type);

}

此方法中判断了 非 $_config[‘db’][‘common’][‘slave_except_table’]   中设置的表及 为 SELECT 查询语句时使用从库的连接从从库查询数据,其他则用默认的使用主库

如果在使用过程中有发现一些异常,或者想控制相关的 sql 语句读取的数据库,可以尝试在此方法中判断 $sql 的语句内容 来指定其需要读的主库 还是 从库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值