您的位置:首页 > 其它

DiscuzX2.5 帖子页面更新浏览量 缓存机制

2012-10-16 18:13 351 查看
DZ帖子页面处理脚本:source/module/forum/forum_viewthread.php
function viewthread_updateviews($tableid) {
global $_G;
if(!$_G['setting']['preventrefresh'] || $_G['cookie']['viewid'] != 'tid_'.$_G['tid']) {
if(!$tableid && $_G['setting']['optimizeviews']) {
if($_G['forum_thread']['addviews']) {
if($_G['forum_thread']['addviews'] < 100) { //如果延迟更新浏览数 小于 100 更新延迟更新表
C::t('forum_threadaddviews')->update_by_tid($_G['tid']);//pre_forum_threadaddviews - 主题查看数延时更新表  addviews每次+1
} else {
if(!discuz_process::islocked('update_thread_view')) {
$row = C::t('forum_threadaddviews')->fetch($_G['tid']);
C::t('forum_threadaddviews')->update($_G['tid'], array('addviews' => 0));//清空 延迟缓存表
C::t('forum_thread')->increase($_G['tid'], array('views' => $row['addviews']+1), true);
discuz_process::unlock('update_thread_view');//进程解锁
}
}
} else {//如果延迟缓存表没有记录 则 insert 一条
C::t('forum_threadaddviews')->insert(array('tid' => $_G['tid'], 'addviews' => 1), false, true);
}
} else {
C::t('forum_thread')->increase($_G['tid'], array('views' => 1), true, $tableid);
}
}
dsetcookie('viewid', 'tid_'.$_G['tid']);
}


第一个if条件 是判断是否后台开启相关功能 $_G['setting']['preventrefresh'] 【查看数开启防刷新

 $_G['forum_thread']['addviews'] 主题查看数延迟缓存表 的addviews 浏览数 

①如果addviews 小于100 把每次浏览数更新到 pre_forum_threadaddviews 延迟缓存表 

②如果addviews 大于等于100时,把pre_forum_threadaddviews 缓存表的 addviews(浏览数) 累加到 thread帖子表内的浏览数字段。并把延迟缓存表的 addviews清空 

解决问题:这样可以有效的防止 Mysql 因为频繁浏览页面 update 更新 views 的锁表  导致无法查询Mysql。大致处理逻辑是这样 ,具体的涉及函数 大家自行看下即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: