虽然很多站点是单数据库服务器,但是有些大站点用的是多数据库服务器,这里就存在了访问远程数据库的问题。
幸好Discuz!提供了这个功能,只需要把config的配置改下就可以了。
在config文件中,加下类似下面的代码,就可以定义一个新的数据库服务器
- //1号数据库服务器
- $_config['db']['1']['dbhost'] = 'localhost';
- $_config['db']['1']['dbuser'] = 'root';
- $_config['db']['1']['dbpw'] = 'root';
- $_config['db']['1']['dbcharset'] = 'gbk';
- $_config['db']['1']['pconnect'] = '0';
- $_config['db']['1']['dbname'] = 'discuz1';
- $_config['db']['1']['tablepre'] = 'pre_';
- //2号数据库服务器
- $_config['db']['2']['dbhost'] = 'localhost1';
- $_config['db']['2']['dbuser'] = 'root';
- $_config['db']['2']['dbpw'] = 'root';
- $_config['db']['2']['dbcharset'] = 'gbk';
- $_config['db']['2']['pconnect'] = '0';
- $_config['db']['2']['dbname'] = 'discuz2';
- $_config['db']['2']['tablepre'] = 'cdb_';
- $_config['db']['map']['common_member'] = 2; //这句表明访问common_member表的操作一律从2号数据库服务器中读取
复制代码 但是现在问题来了,当我调试的时候,发现能登陆上2号数据库服务器,但是程序却总是提示数据表不存在。排查了很久,才发现问题出在数据表前缀上。
注意,1号数据库服务器用的是pre_前缀,而二号数据库服务器用的是cdb_前缀。后来我发现把2号数据库的cdb_common_member改成pre_common_member就能成功读取了。
后来我看了下相关的源代码,发现是这个问题,不管你设置了多少个数据库服务器,程序总是把前缀按照1号数据库服务器的值来取,所以导致的这个错误。
经过上午的一个小修补,问题处理掉了……
打开\source\class\class_core.php(警告,这个是Discuz!核心级别的文件,不了解的请不要随意修改)
找到:
- return $this->tablepre.$tablename;
复制代码 替换成:
- $id = $id ? $id : 1;
- return $this->config[$id]['tablepre'].$tablename;
复制代码 就能成功指定其他数据库服务器的前缀了。
作者:sw08 |