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

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。大致处理逻辑是这样 ,具体的涉及函数 大家自行看下即可。

你可能感兴趣的:(thread,c,mysql,脚本,insert)