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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值