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