我们在用帝国cms整合ucenter时,有时会遇到无法同步,或在帝国cms端登录退出可以实现同步,而在discuz端登陆退出时帝国端无法应的问题,反之也有可能dz端登陆帝国端可以,而帝国端登陆dz端无反应。这里和大家分享一下可能造成无法同步的原因,供大家参考。
一、查看帝国cms目录下的/e/config.inc文件,仔细看每项后边的注释,严格按照实际参数填写。如果不懂怎么填,可以参考ucenter内给出的“应用的 UCenter 配置信息”,特别是5、14行,最好填写为相应的ip或域名。
- define('UC_CONNECT', 'mysql'); // 连接 UCenter 的方式: mysql/NULL, 默认为空时为 fscoketopen()
- // mysql 是直接连接的数据库, 为了效率, 建议采用 mysql
- //数据库相关 (mysql 连接时, 并且没有设置 UC_DBLINK 时, 需要配置以下变量)
- define('UC_DBHOST', '127.0.0.1'); // UCenter 数据库主机
- define('UC_DBUSER', 'root'); // UCenter 数据库用户名
- define('UC_DBPW', ''); // UCenter 数据库密码
- define('UC_DBNAME', 'discuz'); // UCenter 数据库名称
- define('UC_DBCHARSET', 'gbk'); // UCenter 数据库字符集
- define('UC_DBTABLEPRE', 'discuz.pre_ucenter_'); // UCenter 数据库表前缀(格式:数据库.前缀)
- //通信相关
- define('UC_KEY', 'abc1234'); // 与 UCenter 的通信密钥, 要与 UCenter 保持一致
- define('UC_API', 'http://127.0.0.1/bbs/uc_server'); // UCenter 的 URL 地址, 在调用头像时依赖此常量
- define('UC_CHARSET', 'gbk'); // UCenter 的字符集
- define('UC_IP', ''); // UCenter 的 IP, 当 UC_CONNECT 为非 mysql 方式时, 并且当前应用服务器解析域名有问题时, 请设置此值
- define('UC_APPID', 2); // 当前应用的 ID,设置ECMS在Ucenter的ID应用
- define('UC_PPP', '20');
- //同步登录 Cookie 设置
- $cookiedomain = ''; // cookie 作用域
- $cookiepath = '/'; // cookie 作用路径
二、查看ucenter内的应用列表是否通信成功,如果不成功,检查信息填写是否有问题。
三、进入discuz后台,点击 站长 - ucenter 设置,查看“UCenter 数据库服务器”、“ UCenter 访问地址”两项填写是否为正确可访问的地址。
四、如果帝国cms端登陆退出可以同步到discuz,但dz端登陆退出不能同步到帝国端,可以将 /uc_server/data/cache/apps.php 复制到 /uc_client/data/cache/ 文件夹内,覆盖。即可解决。(原因为dz端缓存问题导致无法同步)
五、如果第四步无法成功,接着往下看。
有很多程序整合discuz后,UC中显示通信成功,在整合端登陆注销,DZ也会跟随同步登陆注销,但是反过来在DZ中登陆注销,整合端却不会同步,没有任何变化。这其实是dz的bug,经过查询发现,原来是dz登陆注册的时候没有向UC返回状态信息,导致无法同步。
可用下面的方法解决:
打开 /uc_client/client.php 文件
找到310行左右,如下函数
- function uc_user_synlogin($uid) {
- $uid = intval($uid);
- if(@include UC_ROOT.'./data/cache/apps.php') {
- if(count($_CACHE['apps']) > 1) {
- $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
- } else {
- $return = '';
- }
- }
- return $return;
- }
- function uc_user_synlogout() {
- if(@include UC_ROOT.'./data/cache/apps.php') {
- if(count($_CACHE['apps']) > 1) {
- $return = uc_api_post('user', 'synlogout', array());
- } else {
- $return = '';
- }
- }
- return $return;
- }
替换为
- function uc_user_synlogin($uid) {
- $uid = intval($uid);
- if(@include UC_ROOT.'./data/cache/apps.php') {
- if(count($_CACHE['apps']) > 1) {
- $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
- } else {
- $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
- }
- }
- return $return;
- }
- function uc_user_synlogout() {
- if(@include UC_ROOT.'./data/cache/apps.php') {
- if(count($_CACHE['apps']) > 1) {
- $return = uc_api_post('user', 'synlogout', array());
- } else {
- $return = uc_api_post('user', 'synlogout', array());
- }
- }
- return $return;
- }
这样就可以实现双向同步了。有什么问题大家可以在此留言,此为discuz的bug,希望后期会更新,不过dz已经有许久未更新了。