解决整合DZ论坛注册,调用ucenter1.6注册用户后,刷新论坛欢迎新会员和会员总数

弄公司项目时,整合discuz x3.2论坛,将论坛的注册功能跳转到php项目的注册页面,同步注册的会员信息,使用了dz自带的ucenter1.6接口,打通了注册,但是论坛首页的欢迎新会员和会员数没有自动刷新,一直是最初的样子,如下图的位置

dz欢迎新会员

百度没有找到方法,能找到最好了省事,最后自得自己追踪代码了,DZ的代码好多,各种绕的感觉,也没有注释,差点走错路,还好有人提醒继续往下追踪,最后解决了,写下来记录着。
一、开始找到了 这个地方所在的位置,文件 template\default\forum\discuz.htm  40行左右 代码如下

{lang index_members}: $_G['cache']['userstats']['totalmembers']|{lang welcome_new_members}: $_G['cache']['userstats']['newsetuser']

看到它是用$_G[‘cache’][‘userstats’]缓存写的,然后我就想着去后台更新缓存,果真有用,可每次手动更新不好啊,我想着看哪里调用这个更新缓存。
二、在注册的function找到了 文件source\class\class_member.php 中的注册function on_register()中,在用户注册成功后就刷新了欢迎新会员的缓存,792行左右

require_once libfile('cache/userstats', 'function');
build_cache_userstats();

三、往下追踪build_cache_userstats() 找到了文件source\function\cache\cache_userstats.php 里面就一个方法build_cache_userstats()

function build_cache_userstats() {
    global $_G;
    $totalmembers = C::t('common_member')->count();
    $member = C::t('common_member')->range(0, 1, 'DESC');
    $member = current($member);
    $newsetuser = $member['username'];
    $data = array('totalmembers' => $totalmembers, 'newsetuser' => $newsetuser);
    if($_G['setting']['plugins']['func'][HOOKTYPE]['cacheuserstats']) {
        $_G['userstatdata'] = & $data;
        hookscript('cacheuserstats', 'global', 'funcs', array(), 'cacheuserstats');
    }
    savecache('userstats', $data);
}

之前我以为到这里就无法了,想着怎么在另一个项目中调用论坛的更新缓存,后来发帖寻求帮助,有人指点了可以继续往下找,然后我又继续找代码,感觉找代码好难
四、继续往下找savecache() 找到了文件source\function\function_core.php 786行左右的function savecache($cachename, $data)

function savecache($cachename, $data) {
    C::t('common_syscache')->insert($cachename, $data);
}

然后看到这是DZ修改数据库表的方法,dz的数据库表好多,看着头疼,去查了dzx3的数据字典,这个确实是一个缓存数据表,原来还是查了数据库的信息来建立的缓存,那么在注册的时候修改这个表的信息就可以了,表中形式如图

db
最后一个字段存储着新会员的名字和会员总数,以数组序列化的形式,如 a:2:{s:12:”totalmembers”;i:2;s:10:”newsetuser”;s:4:”test”;}
五、于是我在项目的uc_client\model\user.php(这里不是discuz的目录是自己项目的目录哦)文件下的function add_user()增加了修改缓存表的代码

//更新DZ统计新会员缓存表
$query=$this->db->query("SELECT uid FROM ".DISCUZ_DBTABLEPRE."common_member");   //DISCUZ_DBTABLEPRE 是表前缀
$totalmembers=$this->db->num_rows($query);   //用的uc自带的查询方法,查询用户总数
$newsetuser = $this->db->fetch_first("SELECT username FROM ".DISCUZ_DBTABLEPRE."common_member ORDER BY uid DESC LIMIT 1"); //查询最新的会员名
$data = array('totalmembers' => $totalmembers, 'newsetuser' => $newsetuser['username']); //组合成数组
$data=serialize($data);  //序列化数组
$this->db->query("UPDATE ".DISCUZ_DBTABLEPRE."common_syscache SET data='$data',dateline='".$this->base->time."' WHERE cname='userstats'"); //更新common_syscache表

大功告成,这样在有用户注册的时候,论坛这里的展示也会刷新了。
不过不知在调用ucenter进行通信的时候是不是会自动通知论坛刷新,自己整合uc注册时与官方的有出入,还好的是找到了这个解决方法。