Discuz是Ucenter的一個應用.
Ucenter包含Server和Client,Discuz2.5x 內置有Ucenter server.
下面用Login來討論這是如何實現同步的。
登錄過程
用戶登錄,Dz調用的是 class/class_member.php 中的 on_login()方法,用戶輸入的信息存在一個全局的$_G 數組中。核心內容是
$ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';
字面意思理解就是,檢查ucenter中檢查該應用是否開啟同步登陸,開啟則調用uc_user_synlogin().
有童鞋在debug時遇到DZ的$ucsynlogin為空(正常的話應該是一串JS代碼) , 請檢查全局的數組的 allowsynlogin 字段內容是否正確。也可直接忽略這步。將上述代碼改成$ucsynlogin =uc_user_synlogin($_G['uid']);
uc_user_synlogin
跟進該方法后幾個核心方法調用的路線大概如下:
uc_user_synlogin() ==> uc_api_post() ==> uc_fopen2() ==> uc_fopen() ==> fsockopen()
uc_fopen() 位于 client.php 中,從字面的意思看看這個方法就可以知道client利用socket與server建立連接,通知server進行登陸通知,server對通知做處理后返回給client一串加密的JS代碼,client將這串代碼輸出調用后實現對所有其他應用的登錄,從而實現同步登陸,這里用到了P3P.
如果童鞋的uc_user_synlogin無返回值(目測大部分童鞋都是這個問題),大可跟下這個方法,Trace fsockopen()的參數是否正確,正確的話一般來說一定能夠同步登陸的.
這里看到fsockopen()的第一個參數是($ip ? $ip : $host),再F3一下$ip 和 $host,結果發現是配置文件里面的UC_DBHOST和UC_IP,所以大家得注意了,設置了UC_IP的話ucenter client會忽略UC_DBHOST的設置.
新聞熱點
疑難解答