ucenter通信失败-分析及解决

By | 2011/01/14

ucenter尝试使用ucenter作为用户的控制中心,测试范例可以正常使用,不过ucenter管理中心-应用栏目里面,应用的通信状态总是连接中,而且当我添加了一个应用后,管理中心开始出现无法访问的访问的情况,错误代码是504。花费了几个晚上的时间后,终于一步步解决了这些问题,包括一直提示连接中以及通信失败的的各种情况,下面一步步道来:

既然是504错误,先从服务器及fastcig查起,后来修改了nginx的几个缓存参数。

1
2
3
4
5
6
7
8
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 128k;
fastcgi_buffers 2 256k;#8 128
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

经过测试确实有效,缓解了504错误出现的情况,不过管理中心登录异常缓慢,这样问题应该出现在php代码上面,有地方应该做了死循环一类的请求导致执行时间超时,这个从nginx的errror log里面也可以看出来,看样子要分析代码了。不过这件事情给了我一个教训:使用nginx的时候上面这几个fastcig的参数是很有必要设置的,这样可以大大减少502、504一类错误的产生,过几天再研究这几个参数的详细作用。

得出是源代码导致的问题,就开始分析源代码,首先看看“正在连接”及“通信失败”是怎么生成的,在页面上右击选择查看源代码,会看到如下代码:

1
2
3
4
5
6
7
8
9
10
function testlink() {
	if(apps[run]) {
 
		$('status_' + apps[run]).innerHTML = '正在连接...';
 
		$('link_' + apps[run]).src = $('link_' + apps[run]).getAttribute('testlink') + '&sid=41b3%2BrDVNPa0jwkBODC3A3Elw5t02aiL56vnOUuGQjolMRKdS6WC7B0gggT0%2B6%2FYpqF3SiyM1H9ztA';
 
	}
	run++;
}
1
2
3
4
<strong>手机软件下载</strong>
/mob
<script id="link_2"><!--mce:0--></script><script type="text/javascript"><!--mce:1--></script>
编辑

可以很明显的看出,上面那段代码生成了默认的“正在连接…”的代码。下面的html代码中包含的js脚本去请求了服务器段的php代码,用于判断是否通信成功。所以我们可以直接浏览admin.php?m=app&a=ping&inajax=1&url=%2Fmob&ip=&appid=2&random=6880,看看他的返回值,如果是像我这样一直显示“正在连接”的这个url应该是访问超时,“通信失败”的就直接显示通信失败。找到的源码出处,进一步查看php源代码。

根据m=app&a=ping,可以得知执行的函数是ucenter里面controladmin目录下的app.php文件里面的onping函数,函数很简单,就是根据设置的应用信息去请求相应应用里面的api文件夹下的文件,然后根据返回结果判断是否连接成功。我们可以在函数结束的地方加上

1
2
die("url = $url  
status = $status");

这样就可以看到应用的返回值了,也可以直接把url放到浏览器中查看返回值。如果$status返回的是1那么应该就是正确的,其他的都是错误的。这里分成两种情况写:

1.如果看到了1的返回值,但是还是提示通信失败的话
最大的可能性就是你应用的api文件夹下通信文件(文件名默认为uc.php)的编码问题,在Windows平台把代码转为utf-8的时候,会添加bom头,这个也是引起很多session_start错误的原因,解决办法就不多说了,我自己一般都是使用16进制编辑工具把开头的三个字节去掉,或者直接用dw新建一个网页,把内容拷贝进去保存,这样都可以去掉bom头。

2.如果没有看到返回值
没有返回值的情况就比较多了,应该检查应用api目录下的接口文件(如uc.php)是否有问题。看看是否是include了错误的文件,这个文件是否本身就运行错误等等,还有就是接口文件的uc_note类里面的test函数返回值是否是1。

如果保证了应用接收管理中心通知的api接口没有问题的话,就还是检查onping函数了。比如我的的情况,经过多次检查出在$_ENV[‘app’]->test_api($url, $ip);这个代码上了,想继续跟踪test_api函数,不过就太麻烦了。后来无意中看到“应用的主 URL”(该应用与 UCenter 通信的接口 URL,结尾请不要加“/” ,应用的通知只发送给主 URL),有范例设置的是本机的目录,而我设置的却是一个标准的url路径。应该就是在通过test_api读取远程api接口的时候导致了一个致命的错误直到504错误,这样管理中心也就只显示“正在连接”了。

ucenter确实很不错的,提供了很完整的一整套sso及用户管理的解决方案,而且可以跟原有的系统对接。过几天再写一下个人对ucenter的理解,相信对从来没有使用过的人还是会有点帮助的。

7 thoughts on “ucenter通信失败-分析及解决

  1. gdak47lh

    真蛋疼,浪费我一天时间,如果你的discuz和ucserver是在同一台机器,“UCenter IP 地址”一定要填127.0.0.1

    Reply
  2. zheng

    我的$status =
    追查到 $_ENV[‘app’]->test_api($url, $ip);也不知道如何下手了,启用物理地址 刷新白页。

    Reply
    1. admin Post author

      这个也没啥好办法,一个就是彻底分析test_api这个函数,一个就是设置不同的“应用的主 URL”,一般都是这个不正确造成的。

      Reply

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据