|
现给银河网下面的总站论坛和唐山站进行了 用户中心整合,之前用户数据都已经整合完成,最后因为dns和php.ini配置的问题,总站和唐山分站的 通信未能成功,登陆状态同步也未能成功。因为dns的问题,最终只能勉强将域名改成ip地址来使通信保持成功来保证用户中心整合后的用户数据能够同步到总站这边来。 今天动手将程序调了一遍,总结如下: 首先,是解决通信问题,问题来源于DNS解析的问题。先说说怎么发现是DNS的问题吧,代码调出来的。 打开 admin/ucapp.php文件,找到: - $status = $ucApp->ucfopen($rt['siteurl'], $rt['interface'], $rt['secretkey'], 'Site', 'connect');
这个是返回一个通信的状态,所以通信失败的话,返回这个状态值是等于 -1 的,这个可以在 template/admin/ucapp.htm文件中直接看到: - $s_lang = array(
- '-2' => '<span class="s3">正常</span>',
- '-1' => '<span class="s1">通信失败</span>',
- '1' => '<span class="gray">接口关闭</span>',
- '2' => '<span class="s1">密钥错误</span>',
- '3' => '<span class="s2">未知错误</span>'
- );
那么,现在去看这个 ucfopen方法,他在 uc_client/model/app.php文件中声明的,打开这个文件,找到: - if (!$fp = @fsockopen($parse['host'],$parse['port'],$errnum,$errstr,$limit)) {
- return array('errCode' => -1, 'errMessage' => 'connect fail');
- //return false;
- }
我们可以把fsockopen前面的@去掉,将代码替换成: - if (!$fp = fsockopen($parse['host'],$parse['port'],$errnum,$errstr,$limit)) {
- echo $errstr;exit;
- return array('errCode' => -1, 'errMessage' => 'connect fail');
- //return false;
- }
然后再去后台看通信的信息,可以看到是什么原因引起的通信失败(备注:fsockopen需要php.ini中的url_allow_open开启才能使用); 结果发现显示一串字符串,如下: - php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
经百度查证,是DNS引起的通信失败。所以,要给这台服务器换一个河北的DNS服务器。 编辑 /etc/resolv.conf 配置文件,找到河北的一台DNS放进去: 保存。 然后,去后台看通信,将之前的唐山web服务器的ip地址换成唐山站的域名,提示通信成功。 现在说下同步登陆状态的问题,其实上面的问题解决了以后,同步登陆状态自然就解决了,之前主要是用IP,所以到客户端的站点的cookie就没效果了,换成域名后就没有问题了。但是还是说下调试同步登陆状态的过程。 首先,后台设置:必须开启跳转提示,因为最终生成的一段js请求就是通过refreshto()函数来调用触发的,那个全局变量是在template/wind/lang_refreshto.php文件中定义的: - 'have_login' => '您已经顺利登录{$GLOBALS[showmsginfo]}',
上面这个变量是在 login.php文件中赋值的,打开login.php,找到$showmsginfo这个变量就是,查看变量的值需要看页面的源代码; - list($winduid, $groupid, $windpwd, $showmsginfo) = $logininfo;
然后,$logininfo是通过require/checkpass.php文件中return的, 打开 require/checkpass.php文件,找到: - $uc_user = uc_user_login($username, $password, $lgt);
这个返回的数组有一个数组的key叫“synlogin”就是存放构造好的js请求 打开uc_client/uc_client.php ,找到: - function uc_user_login($username, $password, $logintype, $checkques = 0, $question = '', $answer = '') {
- return uc_data_request('user', 'login', array($username, $password, $logintype, $checkques, $question, $answer));
- }
其中,uc_data_request方法会去请求user对象的login方法,最终会请求到uc_client/control/user.php文件中的usercontrol类中的login方法, 找到: - $this->base->appid && $synlogin = $this->synlogin($user['uid'], $user['username'], $password);
然后看这个类中的另一个方法,synlogin就是用于构造那段js的方法。 - function synlogin($uid, $username, $password) {
- $synlogin = '';
- $mapp = $this->base->load('app');
- $list = $mapp->applist();
- foreach ($list as $appid => $app) {
- if ($appid != $this->base->appid) {
- $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'])));
- $synlogin .= "<script type=\"text/javascript\" src=\"$url\"></script>";
- }
- }
- return $synlogin;
- }
构造js结束。 最终,会通过 login.php文件中的: - refreshto($jumpurl,'have_login');
来调用语言包里边的变量,如何加载语言包可以到global.php文件中查refreshto函数。
|