|
UCenter 是康盛开发的用户中心,主要用于为康盛旗下多款产品提供统一登录服务,类似今天随处可见的第三方登录系统。
在 Discuz!X 系列发布后,Discuz!X 变成了一款集合多种功能于一身的社区软件,包括论坛、CMS、博客等等。在这种情况下 UCenter 所提供的功能就很鸡肋了,因此 UCenter 在 2011.5.5 后就再也没有更新过,而 Discuz!X 在 3.2 版本以后也没有新版本发布,目前处于维护阶段。
现在的问题在于,UCenter 作为 Discuz!X 的核心组件,是必须安装的,而 UCenter 并不支持 Discuz!X 所具有的分布式部署、读写分离以及负载均衡等功能。当应用规模增长到一定程度 UCenter 势必成为系统瓶颈或者最不稳定的部分。本文将探讨一种使 UCenter 支持上述功能的方法。
首先来分析一下 UCenter 的源码,在 Discuz!X 安装包中,有以下两个目录:uc_client 和 uc_server。 Discuz!X 通过 uc_client 连接到 UCenter,uc_server 则是完整的 UCenter。如果安装时选择的是独立安装 Discuz!X,则 uc_server 目录是可以删除的;如果选择的是合并安装,则 Discuz!X 管理后台 UCenter 功能页其实访问的就是 uc_server 目录下的内容。
比较一下 uc_client 与 uc_server 中的内容,发现 uc_client 其实就是 uc_server 的一个子集,从目录结构中可以看出 UCenter 也是安装 MVC 的模式开发的,control 和 model 分别对应 C 和 M,V 只有 uc_server 才有,因为 UCenter 有后台管理界面。显然 model 目录下的内容是与数据库的操作密切相关的,而 Discuz!X 对 UCenter 的访问均通过 uc_client 完成。以 'model/user.php' 为例,该文件封装了对数据表 ’ucenter_members' 的所有操作,而底层的数据库操作,则封装在 ‘lib/dbi.class.php' 中,类似 Discuz!X 的 db_driver_mysqli.php。
通过分析 ‘lib/dbi.class.php' 可以知道,UCenter 不支持读写分离以及分布式部署的根本原因是底层驱动模块不支持。因此产生了一个思路就是能否通过将 UCenter 的底层数据库驱动替换成 Discuz!X 的数据库驱动,然后通过 Discuz!X 配置文件来统一部署 UCenter,从而使得 UCenter 也能支持上述功能。
答案是肯定,下文以 'model/user.php' 中成员函数 ’get_user_by_uid‘ 为例,演示如何将 UCenter 的数据库驱动替换为 Discuz!X 的数据库驱动。
先来看看 UCenter 的源码:
- function get_user_by_uid($uid) {
- $arr = $this->db->fetch_first("SELECT * FROM ".UC_DBTABLEPRE."members WHERE uid='$uid'");
- return $arr;
- }
复制代码
再来看看替换驱动后的代码:
- function get_user_by_uid($uid) {
- $arr = DB::fetch_first("SELECT * FROM ".DB::table('ucenter_members')." WHERE uid='$uid'");
- return $arr;
- }
复制代码
通过以上改造后,在配合对应的 Discuz!X 配置,如:
- $_config['db']['map']['ucenter_members'] = '2';
复制代码 就可以完美实现 UCenter 的分布式部署了,同时读写分离和负载均衡功能也被同步支持,使用方法与 Discuz!X 无异。
综上所述,要实现 UCenter 对分布式功能的完整实现,就必须改写 model 目录下所有模块的成员函数。
(Over)
|
|