Ucenter通信失敗(終極解決)

從my域名遷移到正式域名,直接將本地的程序上傳到正式服務器後,發現UCenter無法正確通信成功。

本地域名:

http://my74cms.shiyishi.tk

ucenter:

http://myucenter.shiyishi.tk

線上環境域名:

http://74cms.shiyishi.tk
http://ucenter.shiyishi.tk

所有涉及到的配置文件都全部正確配置,打開ucenter裏的應用列表,看到應用的狀態仍然是“無法通信”,於是進行了跟蹤。

簡言之,到最後,發現是ucenter的數據緩存未清空,比如appid爲1的應用,其緩存的url爲my74cms.shiyishi.tk ,這顯然是不正確的。於是,清空下緩存,正常了,通信成功了。

參考文章:

[http://wapwenku.baidu.com/view/f6e1c7878762caaedd33d46e?pn=2&vw=all&ssid=&from=&bd_page_type=1&uid=EC203F105F15D41DDE5676E4339F1231&pu=rc@1,pic@on,sl@1,pw@1000,sz@224_220,pd@1,fz@2,lp@2,tpl@color,&st=1&wk=rd&maxpage=5&pos=all](http://wapwenku.baidu.com/view/f6e1c7878762caaedd33d46e?pn=2&vw=all&ssid=&from=&bd_page_type=1&uid=EC203F105F15D41DDE5676E4339F1231&pu=rc@1,pic@on,sl@1,pw@1000,sz@224_220,pd@1,fz@2,lp@2,tpl@color,&st=1&wk=rd&maxpage=5&pos=all)

程序開發必不可少的要去調試。問題可能是多種多樣的,所以需要我們自己能找到解決問題的方法。

一、通信失敗如何調試 如下圖所示
這裏寫圖片描述
看到這個不要怕,其實問題遠沒有你想的那麼複雜

既然是調試,就是刨根問底,就是順藤摸瓜,那就先找個到藤

注:本教程使用Firefox瀏覽器,這裏不是給他AD,是Firefox的一系列調試工具我用的比較熟練

1、我們先看看“通信失敗”這四個字是怎麼來的?

大家有沒有感覺這個通信失敗或者通信成功是在頁面加載之後才顯示出來的。對這個地方並不是頁面直接輸出的。而是頁面重新去加載js去判斷之後顯示的。

我們來看這個頁面的源代碼。ie下可以直接點擊右鍵查看源文件,firefox需要選擇 本幀 –》查看幀源代碼。

之後我們在源代碼中找到剛纔顯示通信失敗的那個標籤。這個不難吧。如下圖所示
這裏寫圖片描述

這個通信狀態就是圖中高亮的那個js處理的結果。看上去和正常的js調用不一樣。別怕,看這個源碼的開始那個js代碼。

<script type="text/javascript">
var apps = new Array();
var run = 0;
function testlink() {
    if(apps[run]) {
        $('status_' + apps[run]).innerHTML = '正在連接...';
        $('link_' + apps[run]).src = $('link_' +
        apps[run]).getAttribute('testlink') +
    '&sid=433eRJFCviO87jtvTWbCz%2FFxfYPPjAcxKUBBQ7JgcgnCuUJcfCbkS0xrgdXuA5ziYZRkXcy%2F2N77HA';
    }
    run++;
}
window.onload = testlink; 
</script> 

明白了吧。

2、既然“藤”找到了,那我們就開始“摸”吧

copy這段代碼直接通過瀏覽器訪問。

這下明白那個通信失敗四個字就來源於此了吧。呵呵。 但是還是不知道爲啥失敗啊?

別急,還沒有摸到瓜,我不喊停你就繼續摸啊。

接下來就要在uc的代碼中設置幾個斷點,其實就是 echo 之後die。 我們來看當前的url地址。

http://uc.860472.com/admin.php?m=app&a=ping&inajax=1&url=http%3A%2F%2Fwww.860472.com&ip=&appid=1&random=1377646808

m=app 就代表着這個控制器原型是 app,因爲是後臺的訪問,因此對應的就是 ucenter 目錄下的 ./control/admin/app.php

a=ping 代表着執行的是控制器原型中的 onping 方法

注:這個如果想刨根問底的同學可以去看入口程序admin.php

好,有向前了一小步,我們打開 ./control/admin/app.php 文件,找到 onping 方法,源碼如下:

function onping() {
    $ip = getgpc('ip'); $url = getgpc('url');
    $appid = intval(getgpc('appid'));
    $app = $_ENV['app']->get_app_by_appid($appid); $status = '';
    if($app['extra']['apppath'] && @include $app['extra']['apppath'].'./api/'.$app['apifilename']) {
        $uc_note = new uc_note();
        $status = $uc_note->test($note['getdata'], $note['postdata']);
    } else {
        $this->load('note');
        $url = $_ENV['note']->get_url_code('test', '', $appid); 
        $status = $_ENV['app']->test_api($url, $ip);
    }
    if($status == '1') {
        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();';
    } else {
        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();';
    }
}

這個代碼我就不一一解釋了。用點心,仔細一點都能看明白。

我們可以看到這個status1 status ,看看不等於1的時候他是個什麼東東。 在

if($status == '1') {
    echo "\$url = $url <br />\n \$status = $status<br />\n";die('haha');

好的,斷點也設置了,之後保存代碼重新去刷新剛纔的頁面。

3、終於快摸到“瓜”了,有點小興奮,原來調試也不難吧。

刷新頁面後看到這樣的東東
這裏寫圖片描述

哦。原來是我的這個應用的訪問地址弄錯了。

4、摸到瓜了吧,接下來對症下藥是不是很簡單了。

記得去掉剛纔的調試代碼

(備註:文中圖片爲個人實踐情況補充,與原文作者無關)
原文地址:http://www.cnblogs.com/hanxianlong/archive/2013/06/03/3115812.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章