博客小子:记录我们对互联网和生活的探索! 注册 | 登陆

关于Ucenter通信失败的又一次调试经历

Tags: ucenter, 通信失败

相信无数开发者无数次见识过这个问题了:ucenter的通信失败问题。其实算不得什么大问题,但是官方给出的可以debug的方式实在太少了。今天我几乎花了一天来跳是一个小问题,最后发现居然是客户端数据库配置的问题,不知道各位有没有遇到过。

问题大概是很简单:我直接上传了一个ucenter安装包的客户端和例子上去,后台新建一个程序就开起来运行了。

但是没有注意看ucenter管理后台的通信状况,根据以前的经验不会有什么问题的,只要指明$database方式。于是就在前台用类似于http://www.blogguy.cn/ucexample_2.php这种地址访问,发现整个要用完全正常,可是后来不经意间到ucenter后台一看,吓一跳:通信失败,可是前台明明可以用啊!奇了怪了。

到网上找了很多资料都没有找到完全跟我的问题一样的,花了好几个小时找资料,最后还是自己决定自己调试吧,这个变态的问题。

打开firefox,慢得跟狗一样,泪流满面啊,关掉。

开opera吧,dragonfly也不错,再次泪流满面了已经。

 

开ucenter的后台应用管理刷新一下,看图吧,不多说了:

大小: 24.73 K
尺寸: 550 x 180
浏览: 8 次
点击打开新窗口浏览全图

于是打开ucenter的control/admin/app.php(因为m=app啊)

打开找,找到这里:

function onping() {

注意看

PHP代码
  1. if($status == '1') {   
  2.     echo 'document.getElementById(\'status_'.$appid.'\').innerHTML = "<img src=\'images/correct.gif\' border=\'0\' class=\'statimg\' \/><span class=\'green\'>'.$this->lang['app_connent_ok'].'</span>";testlink();';   
  3. else {   
  4.     echo 'document.getElementById(\'status_'.$appid.'\').innerHTML = "<img src=\'images/error.gif\' border=\'0\' class=\'statimg\' \/><span class=\'red\'>'.$this->lang['app_connent_false'].'</span>";testlink();';   
  5. }  

 

表示只有$status == '1'才能显示通信成功,否则通信失败。那问题就来了,如果客户端返回的是警告然后紧接是1,或者是先返回一个错误再反悔1,那不是通信也是失败的,但是程序可以正常跑,这大概就是我遇到的问题吧,我这么猜想的,后来的事实基本上验证了我的猜测是对的。

接下来在if($status == '1') {的一样前,添加一句,返回请求地址

echo "\$url = $url <br />\n \$status<br />\n";
exit(www.blogguy.cn);

再访问一下刚才第一步dragonfly捕捉到的地址,看看返回结果,看图说话

大小: 22.49 K
尺寸: 463 x 172
浏览: 18 次
点击打开新窗口浏览全图

看到了吗?正常的返回了1,但是前面有一个mysql错误。同时你又获得了一个崭新的地址:

http://www.blogguy.cn/api/uc.php?code=81546hazAnMDFvVl867WUT9bGDNNwr1UPHFG04YvcNieV%2FUNs8%2FD7Xlveq4YzHPGR69CLqvNmmM

重点是后面的code参数,你可以直接访问这个地址以判断问题出在哪儿,继续看uc.php文件,找Can not connect to MySQL server出现的位置。

看到这儿:

  require_once DISCUZ_ROOT.'./include/db_mysql.class.php';
  $GLOBALS['db'] = new dbstuff;
  $GLOBALS['db']->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset);
  $GLOBALS['tablepre'] = $tablepre;
  unset($dbhost, $dbuser, $dbpw, $dbname, $pconnect);

意思是uc.php强行引入了'./include/db_mysql.class.php',并使用构造函数初始化,也就是说如果初始化失败了就要返回数据库连接错误,问题就在这儿了,如果你的客户端没有自己的数据库,或者你不用数据库的话也必须配置一个可以使用的可以连接的数据库上去,不然肯定会失败。找到问题了就好办了,在config.inc.php中把这个配置信息写进去就好了。

问题是解决了,但是现在回头来看ucenter的结构以及演示文件都非常差劲的,特别是演示文件,简直是把discuz当成是唯一的应用了,从变量命名到缓存到函数都是discuz的,那我不仅要问:既然目标是为discuz服务的为什么还要开放ucenter独立出来,牛皮还吹得挺大。又是折腾一天,blogguy.cn累了。这真是一个该死的问题。

转载请注明来自www.blogguy.cn

收工,把文件一个个还原回去。

Tags: ucenter, 通信失败

« 上一篇:apache的server-status如何分析的技术说明 | 下一篇:mysql如何使用replace 批量替换函数 »

只显示10条记录相关文章

Trackbacks

点击获得Trackback地址,Encode: UTF-8

4条记录访客评论

遇到同样问题,觉得哪个演示确实很烂,api/uc.php要用的话需要全部重写。

Post by hxm on 2011, August 23, 10:30 AM 引用此文发表评论 #1

太好了,找到了,谢谢你的调试方法,原来要在 客户端
添加一个配置文件的 它默认是 api/uc.php 这个没有。。要自己加上去

Post by solq on 2011, August 24, 2:19 AM 引用此文发表评论 #2

我也是遇到同样的问题,但是$status返回的信息是空的,在网上翻来翻去的还是没能找到问题所在,真的像1楼的说,似乎真的要重写api/uc.php这个文件,我感觉真的很晕菜啊~

Post by Ivan on 2011, August 31, 3:40 PM 引用此文发表评论 #3

我也是通信失败,但是程序调用没有问题,本人是用java和discuz整合的,不懂php,我也发现在我这边没有api/uc.php这个文件,但是本人不懂php,也不太了解uc.php中需要哪些方法,楼主能不能再详细一点,感觉很郁闷。

Post by orange on 2011, November 5, 2:39 PM 引用此文发表评论 #4


发表评论

评论内容 (必填):