分类 代码分析 下的文章

开启防刷新后,个人空间的访问数和日志的浏览数不更新的问题分析

今日无事看了下个人空间的访问数更新处理代码,结果发现开启防刷新后个人空间的访问数无法更新,看过代码后发现根本没有开启防刷新后的代码处理,即开启防刷新后个人空间的访问数不会更新。

下面以个人空间的访问数更新为例,具体分析:
source\include\space\space_index.php文件里,67行附近代码:

if(!$_G['setting']['preventrefresh'] || ($_G['uid'] && !$space['self'] && !in_array($space['uid'], $viewuids))) {
	member_count_update($space['uid'], array('views' => 1));
	$viewuids[$space['uid']] = $space['uid'];
	dsetcookie('viewuids', implode('_', $viewuids));
}

1017日更新:
$_G['setting']['preventrefresh']为后台的查看数开启防刷新的设置,位置在全局->空间设置->基本设置下。
!$_G['setting']['preventrefresh']为未开启此设置。
($_G['uid'] && !$space['self'] && !in_array($space['uid'], $viewuids))为开启后的条件判断,当前登录用户的UID不在$viewuids数组中且不是访问的自己的空间。
$_G['uid']为登录用户的UID。
$space['self']为自己的空间。
$viewuids为从cookie里获取访问过此空间的用户的UID数组。

member_count_update($space['uid'], array('views' => 1));

此段代码即为更新表pre_common_member_home_field里views字段(访问量)。

访问门户频道绑定的域名仍跳转到默认域名下的分析

问题描述:

已在后台->门户->频道栏目下设置某个一级栏目的绑定域名,但是访问此域名,仍会跳转到门户域名下的频道地址上。

如后台设置的新闻频道的绑定域名为news.a.com,设置的默认域名为www.a.com,访问news.a.com会302跳转到www.a.com/portal.php?mod=list&catid=x的地址(www.a.com为门户域名,x为新闻频道的ID)。

 

原因:

绑定的域名生效同时还需要设置频道的目录名称,否则会跳转到门户域名下的频道地址。

 

代码分析:

在cache_portalcategory.php文件中的build_cache_portalcategory函数中,

$domain = $_G['setting']['domain'];
//$_G['setting']['domain']为后台->全局->域名设置下设置的域名,为数组。
$channelrootdomain = !empty($domain['root']) && !empty($domain['root']['channel']) ? $domain['root']['channel'] : '';
//$channelrootdomain为频道根域名,如果没有设置频道根域名则为空。
$portaldomain = '';
if(!empty($domain['app']['portal'])) {
	$portaldomain = 'http://'.$domain['app']['portal'].$_G['siteroot'];
} elseif(!empty($domain['app']['default'])) {
	$portaldomain = 'http://'.$domain['app']['default'].$_G['siteroot'];
} else {
	$portaldomain = $_G['siteurl'];
}
//$portaldomain为门户域名
//$domain['app']['default']为应用域名下的门户域名
//$domain['app']['default']为应用域名下的默认域名
//$_G['siteurl']为站点url

对应关系如下:

if($channelrootdomain && $data[$topid]['domain']){
//如果存在频道根域名,同时设置该频道栏目绑定了域名
	$url = 'http://'.$data[$topid]['domain'].'.'.$channelrootdomain.'/';
	//设置该频道栏目的url为http://频道栏目绑定的域名.频道根域名/
	if($foldername) {
	//如果设置了频道的目录名称
		if(!empty($value['upid'])) {
		//如果存在父级分类
			$url .= $foldername;
			//设置该频道栏目的url为http://频道栏目绑定的域名.频道根域名/频道的目录名称
		}
	} else {
		$url = $portaldomain.'portal.php?mod=list&catid='.$key;
		//没有设置频道的目录名称的话,设置该频道栏目的url为门户域名.poral.php?mod=list&catid=x(x为该频道栏目ID)
		//从这里可以看出来,如果仅设置了频道域名而没有设置频道的目录名称,则频道栏目的url还是会使用门户域名而非频道栏目绑定的域名
	}
} elseif ($foldername) {
//没有设置频道根域名,但是设置了频道的目录名称
	$url = $portaldomain.$foldername;
	//设置该频道栏目的url为门户域名.频道的目录名称
	if(substr($url, -1, 1) != '/') $url.= '/';
} else {
//没有设置频道根域名,没有设置频道的目录名称
	$url = $portaldomain.'portal.php?mod=list&catid='.$key;
	//设置该频道栏目的url为门户域名.portal.php?mod=list&catid=x(x为该频道栏目ID)
}