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

2015-05-30 13:49:56

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

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

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

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

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

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

 

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

 

于是打开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捕捉到的地址,看看返回结果,看图说话

 

看到了吗?正常的返回了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

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

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注