space.php是UCenter Home的入口文件之一,通过它可以进入用户个人主页。

下面,我们来一点点吃掉它。

首先它引入了两个php文件,一个是common.php,一个是data文件夹下的data_magic.php。

然后是处理rewrite设置,这里就不多讲了,我也不太清楚它的作用。

//允许动作
$dos = array('feed', 'doing', 'mood', 'blog', 'album', 'thread', 'mtag', 'friend', 'wall', 'tag', 'notice', 'share', 'topic', 'home', 'pm', 'event', 'poll', 'top', 'info', 'videophoto');

点评:此代码,设置允许的动作,将这些动作保存在数组中,如果动作存在数组中,就可以执行,否则就跳转到index页面。

//获取变量
$isinvite = 0;
$uid = empty($_GET['uid'])?0:intval($_GET['uid']);
$username = empty($_GET['username'])?'':$_GET['username'];
$domain = empty($_GET['domain'])?'':$_GET['domain'];
$do = (!empty($_GET['do']) && in_array($_GET['do'], $dos))?$_GET['do']:'index';     //进入相应的动作
if($do == 'home') {
    $do = 'feed';
} elseif ($do == 'index') {
    //邀请好友
    $invite = empty($_GET['invite'])?'':$_GET['invite'];
    $code = empty($_GET['code'])?'':$_GET['code'];
    $reward = getreward('invitecode', 0);
    if($code && !$reward['credit']) {
        $isinvite = -1;
    } elseif($invite) {
        $isinvite = $_SGLOBAL['db']->result($_SGLOBAL['db']->query("SELECT id FROM ".tname('invite')." WHERE uid='$uid' AND code='$invite' AND fuid='0'"), 0);
    }
}

点评:此段代码获取变量,正如注释所说的一样,前面的几个就不多说了,主要的是$do,获取动作之后如果存在就获取,否则就设为index。

//是否公开
if(empty($isinvite) && empty($_SCONFIG['networkpublic'])) {
    checklogin();//需要登录
}

点评:检验是否已经登录,这里的checklogin()方法来自于function_common.php中。

function_common.php是common.php中引入的,所以可以在space.php中进行使用。其checklogin()方法的具体代码如下,仅作参考。

//检查是否登录
function checklogin() {
    global $_SGLOBAL, $_SCONFIG;

    if(empty($_SGLOBAL['supe_uid'])) {
        ssetcookie('_refer', rawurlencode($_SERVER['REQUEST_URI']));
        showmessage('to_login', 'do.php?ac='.$_SCONFIG['login_action']);
    }
}

如果用户id不存在就会跳转到登陆界面。

//获取空间
if($uid) {
    $space = getspace($uid, 'uid');
} elseif ($username) {
    $space = getspace($username, 'username');
} elseif ($domain) {
    $space = getspace($domain, 'domain');
} elseif ($_SGLOBAL['supe_uid']) {
    $space = getspace($_SGLOBAL['supe_uid'], 'uid');
}

点评:此段代码的作用是获取相应的空间信息,根据uid或者username或者其他的一些信息。

if($space) {
    
    //验证空间是否被锁定
    if($space['flag'] == -1) {
        showmessage('space_has_been_locked');
    }
    
    //隐私检查
    if(empty($isinvite) || ($isinvite<0 && $code != space_key($space, $_GET['app']))) {
        //游客
        if(empty($_SCONFIG['networkpublic'])) {
            checklogin();//需要登录
        }
        if(!ckprivacy($do)) {
            include template('space_privacy');
            exit();
        }
    }
    
    //别人只查看自己
    if(!$space['self']) {
        $_GET['view'] = 'me';
    } else if(empty($space['feedfriend']) && empty($_GET['view'])) {
        $_GET['view'] = 'all';
    }
    if ($_GET['view'] == 'me') {
        $space['feedfriend'] = '';
    }
    
} elseif($uid) {

    //判断当前用户是否删除
    $query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('spacelog')." WHERE uid='$uid' AND flag='-1'");
    if($value = $_SGLOBAL['db']->fetch_array($query)) {
        showmessage('the_space_has_been_closed');
    }
    
    //未开通空间
    include_once(S_ROOT.'./uc_client/client.php');
    if($user = uc_get_user($uid, 1)) {
        $space = array('uid' => $user[0], 'username' => $user[1], 'dateline'=>$_SGLOBAL['timestamp'], 'friends'=>array());
        $_SN[$space['uid']] = $space['username'];
    }
}

点评:获取空间信息。以及身份,权限等等。

//游客
if(empty($space)) {
    $space = array('uid'=>0, 'username'=>'guest', 'self'=>1);
    if($do == 'index') $do = 'feed';
}

点评:游客身份

 

//更新活动session
if($_SGLOBAL['supe_uid']) {
    
    getmember(); //获取当前用户信息
    
    if($_SGLOBAL['member']['flag'] == -1) {
        showmessage('space_has_been_locked');
    }
    
    //禁止访问
    if(checkperm('banvisit')) {
        ckspacelog();
        showmessage('you_do_not_have_permission_to_visit');
    }
    
    updatetable('session', array('lastactivity' => $_SGLOBAL['timestamp']), array('uid'=>$_SGLOBAL['supe_uid']));
}

点评:获取用户信息,getmember()来自于function_common.php中

//对话框
function showmessage($msgkey, $url_forward='', $second=1, $values=array()) {
    global $_SGLOBAL, $_SC, $_SCONFIG, $_TPL, $space, $_SN;

    obclean();

    //去掉广告
    $_SGLOBAL['ad'] = array();
    
    //语言
    include_once(S_ROOT.'./language/lang_showmessage.php');
    if(isset($_SGLOBAL['msglang'][$msgkey])) {
        $message = lang_replace($_SGLOBAL['msglang'][$msgkey], $values);
    } else {
        $message = $msgkey;
    }
    //手机
    if($_SGLOBAL['mobile']) {
        include template('showmessage');
        exit();
    }
    //显示
    if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) {
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: $url_forward");
    } else {
        if($_SGLOBAL['inajax']) {
            if($url_forward) {
                $message = "<a href=\"$url_forward\">$message</a><ajaxok>";
            }
            //$message = "<h1>".$_SGLOBAL['msglang']['box_title']."</h1><a href=\"javascript:;\" onclick=\"hideMenu();\" class=\"float_del\">X</a><div class=\"popupmenu_inner\">$message</div>";
            echo $message;
            ob_out();
        } else {
            if($url_forward) {
                $message = "<a href=\"$url_forward\">$message</a><script>setTimeout(\"window.location.href ='$url_forward';\", ".($second*1000).");</script>";
            }
            include template('showmessage');
        }
    }
    exit();
}

showmessage()方法中的内容。

//对话框
function showmessage($msgkey, $url_forward='', $second=1, $values=array()) {
    global $_SGLOBAL, $_SC, $_SCONFIG, $_TPL, $space, $_SN;

    obclean();

    //去掉广告
    $_SGLOBAL['ad'] = array();
    
    //语言
    include_once(S_ROOT.'./language/lang_showmessage.php');
    if(isset($_SGLOBAL['msglang'][$msgkey])) {
        $message = lang_replace($_SGLOBAL['msglang'][$msgkey], $values);
    } else {
        $message = $msgkey;
    }
    //手机
    if($_SGLOBAL['mobile']) {
        include template('showmessage');
        exit();
    }
    //显示
    if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) {
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: $url_forward");
    } else {
        if($_SGLOBAL['inajax']) {
            if($url_forward) {
                $message = "<a href=\"$url_forward\">$message</a><ajaxok>";
            }
            //$message = "<h1>".$_SGLOBAL['msglang']['box_title']."</h1><a href=\"javascript:;\" onclick=\"hideMenu();\" class=\"float_del\">X</a><div class=\"popupmenu_inner\">$message</div>";
            echo $message;
            ob_out();
        } else {
            if($url_forward) {
                $message = "<a href=\"$url_forward\">$message</a><script>setTimeout(\"window.location.href ='$url_forward';\", ".($second*1000).");</script>";
            }
            include template('showmessage');
        }
    }
    exit();
}

最后是处理动作

//计划任务
if(!empty($_SCONFIG['cronnextrun']) && $_SCONFIG['cronnextrun'] <= $_SGLOBAL['timestamp']) {
    include_once S_ROOT.'./source/function_cron.php';
    runcron();
}

//处理
include_once(S_ROOT."./source/space_{$do}.php");

 至此,代码分析完毕,可能还会感觉晕乎乎的,这很正常。因为熟悉业务本身就是一个体力活。要一点点的摸索,探索其中的奥秘,一点一点的扒开衣服。

经过探索,发现首页的视图文件来自于template/default/space_feed.htm

UCenterHome会有缓存文件,把每一次的视图都缓存下来。缓存到tpl_cache文件夹下面。所以删除space_feed.htm并没有使得页面失效。这是缓存搞得鬼,这里的缓存不是浏览器缓存,而是实实在在的文件缓存。