论坛风格切换
  • 5441阅读
  • 3回复

[转换升级相关]后台用户中心通信和同步登陆方案总结 [复制链接]

上一主题 下一主题
离线rickyleo
 

发帖
315
金币
0
威望
99
只看楼主 倒序阅读 使用道具 楼主  发表于: 2011-07-13
关键词: 用户中心通信
现给银河网下面的总站论坛和唐山站进行了用户中心整合,之前用户数据都已经整合完成,最后因为dns和php.ini配置的问题,总站和唐山分站的通信未能成功,登陆状态同步也未能成功。因为dns的问题,最终只能勉强将域名改成ip地址来使通信保持成功来保证用户中心整合后的用户数据能够同步到总站这边来。


今天动手将程序调了一遍,总结如下:

首先,是解决通信问题,问题来源于DNS解析的问题。先说说怎么发现是DNS的问题吧,代码调出来的。
打开 admin/ucapp.php文件,找到:
  1. $status = $ucApp->ucfopen($rt['siteurl'], $rt['interface'], $rt['secretkey'], 'Site', 'connect');
这个是返回一个通信的状态,所以通信失败的话,返回这个状态值是等于 -1 的,这个可以在template/admin/ucapp.htm文件中直接看到:
  1. $s_lang = array(
  2.     '-2' => '<span class="s3">正常</span>',
  3.     '-1' => '<span class="s1">通信失败</span>',
  4.     '1'  => '<span class="gray">接口关闭</span>',
  5.     '2'  => '<span class="s1">密钥错误</span>',
  6.     '3'  => '<span class="s2">未知错误</span>'
  7. );
那么,现在去看这个ucfopen方法,他在uc_client/model/app.php文件中声明的,打开这个文件,找到:
  1. if (!$fp = @fsockopen($parse['host'],$parse['port'],$errnum,$errstr,$limit)) {
  2.                return array('errCode' => -1, 'errMessage' => 'connect fail');
  3.                //return false;
  4.         }
我们可以把fsockopen前面的@去掉,将代码替换成:
  1. if (!$fp = fsockopen($parse['host'],$parse['port'],$errnum,$errstr,$limit)) {
  2.                 echo $errstr;exit;
  3.                 return array('errCode' => -1, 'errMessage' => 'connect fail');
  4.                 //return false;
  5. }
然后再去后台看通信的信息,可以看到是什么原因引起的通信失败(备注:fsockopen需要php.ini中的url_allow_open开启才能使用);
结果发现显示一串字符串,如下:
  1. php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
经百度查证,是DNS引起的通信失败。所以,要给这台服务器换一个河北的DNS服务器。
编辑  /etc/resolv.conf 配置文件,找到河北的一台DNS放进去:
  1. nameserver 202.99.160.68
保存。
然后,去后台看通信,将之前的唐山web服务器的ip地址换成唐山站的域名,提示通信成功。


现在说下同步登陆状态的问题,其实上面的问题解决了以后,同步登陆状态自然就解决了,之前主要是用IP,所以到客户端的站点的cookie就没效果了,换成域名后就没有问题了。但是还是说下调试同步登陆状态的过程。
首先,后台设置:必须开启跳转提示,因为最终生成的一段js请求就是通过refreshto()函数来调用触发的,那个全局变量是在template/wind/lang_refreshto.php文件中定义的:
  1. 'have_login'            => '您已经顺利登录{$GLOBALS[showmsginfo]}',
上面这个变量是在 login.php文件中赋值的,打开login.php,找到$showmsginfo这个变量就是,查看变量的值需要看页面的源代码;
  1. list($winduid, $groupid, $windpwd, $showmsginfo) = $logininfo;
然后,$logininfo是通过require/checkpass.php文件中return的,
打开 require/checkpass.php文件,找到:
  1. $uc_user = uc_user_login($username, $password, $lgt);
这个返回的数组有一个数组的key叫“synlogin”就是存放构造好的js请求
打开uc_client/uc_client.php ,找到:
  1. function uc_user_login($username, $password, $logintype, $checkques = 0, $question = '', $answer = '') {
  2.          return uc_data_request('user', 'login', array($username, $password, $logintype, $checkques, $question, $answer));
  3. }
其中,uc_data_request方法会去请求user对象的login方法,最终会请求到uc_client/control/user.php文件中的usercontrol类中的login方法,
找到:
  1. $this->base->appid && $synlogin = $this->synlogin($user['uid'], $user['username'], $password);
然后看这个类中的另一个方法,synlogin就是用于构造那段js的方法。
  1. function synlogin($uid, $username, $password) {
  2.         $synlogin = '';
  3.         $mapp = $this->base->load('app');
  4.         $list = $mapp->applist();
  5.         foreach ($list as $appid => $app) {
  6.             if ($appid != $this->base->appid) {
  7.                 $url = $mapp->urlformat($app['siteurl'], $app['interface'], $app['secretkey'], 'User', 'synlogin', array('user' => $this->base->strcode($uid . "\t" . $username . "\t" . $password . "\t" . $this->base->time, $app['secretkey'])));
  8.                 $synlogin .= "<script type=\"text/javascript\" src=\"$url\"></script>";
  9.             }
  10.         }
  11.         return $synlogin;
  12.     }
构造js结束。
最终,会通过 login.php文件中的:
  1. refreshto($jumpurl,'have_login');
来调用语言包里边的变量,如何加载语言包可以到global.php文件中查refreshto函数。














离线太史慈

发帖
766
金币
626
威望
556
只看该作者 沙发  发表于: 2011-08-01
PW8开发文档用户中心
[url=http://www.phpwind.com]phpwind[/url]
离线太史慈

发帖
766
金币
626
威望
556
只看该作者 板凳  发表于: 2011-08-01
两种整合教程有什么区别
跟这个教程相比http://phpwind.me/202.html
这个是用cookie同步进行整合,方法比较简单,会读代码的人一般都可以整好

用用户中心的话规范点。
[url=http://www.phpwind.com]phpwind[/url]

发帖
1
金币
0
威望
0
只看该作者 地板  发表于: 2012-06-21
我将PW和蚂蚁整合后出的通信正常,蚂蚁注册用户难登录PW,PW注册用户 却不能登录蚂蚁,PW消息也显示:未通知,点也不通知,不如何解决这个问题,
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
提到某人:
选择好友
上一个 下一个