Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31864
  • 博文数量: 8
  • 博客积分: 272
  • 博客等级: 二等列兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-20 17:18
文章分类

全部博文(8)

文章存档

2012年(8)

分类: 系统运维

2012-04-27 11:47:29

最近论坛升级,只要把数据导下就OK,在正式切换之前已经做过测试,一切OK。
等正式切换后,发现ucenter通信不成功,之后调了很久,没有发现原因所在,去网上搜寻这类问题,也按照官方给的排查方案走了一遍(应用端的uc key之类的信息和后台都一样),发现都没有用。没办法,编辑那边催着,只能通过代码排除了,其实我挺烦这种的。
首先通过firebug,追踪到显示通信失败那的代码

我这是通信成功,其实显示的代码都差不多,然后看testlink后的那个url,src后面的也一样,可以追踪到处理这个的php文件,研究下admin.php,可以知道就是uc_server/control/admin/app.php中的onping方法

点击(此处)折叠或打开

  1. function onping() {
  2.         $ip = getgpc('ip');
  3.         $url = getgpc('url');
  4.         $appid = intval(getgpc('appid'));
  5.         $app = $_ENV['app']->get_app_by_appid($appid);
  6.         $status = '';
  7.         if($app['extra']['apppath'] && @include $app['extra']['apppath'].'./api/'.$app['apifilename']) {
  8.             $uc_note = new uc_note();
  9.             $status = $uc_note->test($note['getdata'], $note['postdata']);
  10.         } else {
  11.             $this->load('note');
  12.             $url = $_ENV['note']->get_url_code('test', '', $appid);
  13.             $status = $_ENV['app']->test_api($url, $ip);
  14.         }
  15.         if($status == '1') {
  16.             echo 'document.getElementById(\'status_'.$appid.'\').innerHTML = "'.$this->lang['app_connent_ok'].'";testlink();';
  17.         } else {
  18.             echo 'document.getElementById(\'status_'.$appid.'\').innerHTML = "'.$this->lang['app_connent_false'].'";testlink();';
  19.         }

  20.     }
根据这段代码可以看出通信成不成功是看status的值,现在是通信失败,我打印出来$status的值肯定为空,因为是生产环境,因此最好是通过写日志文件的方式来测试,并确保日志文件可写,也可以直接在服务器下建,并通过chmod 777 filename赋予权限

点击(此处)折叠或打开

  1. $logpath = "/home/tmg/test"
  2. $logfile = "test.log";
  3. if(!is_dir($logpath)){
  4.    mkdir($logpath,0777,true);
  5. }
  6. if($handle = fopen($logpath.'/'.$logfile,"w+")){
  7.     fwrite($handle,$status);
  8.     fcolse($handle);
  9. }


如果你填写了物理路径,你就看第一段代码的第一个if那,如果没填写,你就看第一个else那,我没填写,那就看else,想来if那应该也差不多。
首先是$this->load('note');这句是加载文件,是uc_server/model/note.php文件,可以看这个方法


点击(此处)折叠或打开

  1. function get_url_code($operation, $getdata, $appid) {
  2.         $app = $this->apps[$appid];
  3.         $authkey = $app['authkey'];
  4.         $url = $app['url'];
  5.         $apifilename = isset($app['apifilename']) && $app['apifilename'] ? $app['apifilename'] : 'uc.php';
  6.         $action = $this->operations[$operation][1];
  7.         $code = urlencode($this->base->authcode("$action&".($getdata ? "$getdata&" : '')."time=".$this->base->time, 'ENCODE', $authkey));
  8.         return $url."/api/$apifilename?code=$code";
  9.     }

通过写日志文件,看到$url和$authkey的值都为空,然后追踪apps这个变量,在这个php文件里可以找到这么一段

点击(此处)折叠或打开

  1. function notemodel(&$base) {
  2.         $this->base = $base;
  3.         $this->db = $base->db;
  4.         $this->apps = $this->base->cache('apps');
其实读的就是一个cache文件,有兴趣的同学可以看下这个cache文件是怎么写的,这里就不一一赘述了。这个cache文件就是uc_server/data/cache/apps.php。打开这个文件,发现discuz应用信息跟我后台填写的不一致。然后我修改几次,它还是不变,然后我查看了下cache这个文件夹的权限,是755,其实应该是可以的,因为之前测试时也是这个权限,www用户是可以读写的,我试着把它修改为777,再试,通信成功。为什么升级之后就不行,原因不明,将继续跟踪,先记录到这吧。

其实也是介绍一种跟踪问题的方法,呵呵。最后推荐一个网站,里面讲了好多uc方面的东东,



阅读(1250) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~