UCenter Home代码研读之space.php
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并没有使得页面失效。这是缓存搞得鬼,这里的缓存不是浏览器缓存,而是实实在在的文件缓存。