国产又猛又爽又黄视频|在线观看人成视频免费|少妇高潮太爽了在线视频|911国产免费无码专区|特黄做受又大又粗又长大片|欧美一级二级免费在线观看|日日夜人人澡人人澡人人看免|欧洲午夜精品一级毛片在线播放

Discuz緩存造成為登錄用戶/游客不能翻頁問題淺析

2015-12-14 19:46 欄目:技術(shù)開發(fā) 查看(11841)

雖說現(xiàn)在的微信大行其道,很多人認(rèn)為BBS已經(jīng)沒落;但就我們觀察所知,至少是在長沙地區(qū),很多企業(yè)開始做自己的社區(qū),因?yàn)楝F(xiàn)在的社區(qū)一樣可以結(jié)合微信來做,獲取來自微信的流量,然后在自己的社區(qū)發(fā)酵轉(zhuǎn)化。

但企業(yè)的社區(qū)一般來講內(nèi)容結(jié)構(gòu)是比較簡單的,如果用傳統(tǒng)的“版塊”來講,可能也就是那么幾個版塊而已,一般就是讓用戶交流自己產(chǎn)品或者給用戶曬單、提意見的。特別是小米論壇等知名企業(yè)社區(qū)采用直接內(nèi)容列表作為首頁后,各大企業(yè)社區(qū)紛紛效仿。

說了這么久沒用的,這里我們當(dāng)然會一如既往的說很多論壇基于Discuz這款產(chǎn)品來做的,比如知名的小米社區(qū)就是。大家也都知道默認(rèn)情況下Discuz的起始文件index.php會定向到forum.php,而這個腳本不帶任何參數(shù)調(diào)用的模版是discuz.htm這個文件。

而開發(fā)過Discuz模版的朋友都知道,這個discuz.htm是經(jīng)常被我們操刀的,因?yàn)楹芏鄷r候它就是我們網(wǎng)站的首頁。也知道實(shí)際上其中包含的不僅僅是簡單的幾個版塊,同時也包括分區(qū)頁面、不同橫排版塊數(shù)量的判斷等等。

而要實(shí)現(xiàn)打開網(wǎng)站的域名就呈現(xiàn)全站帖子列表的形式,要么一開始定向到一個新增的頁面,這個頁面來調(diào)用數(shù)據(jù)(這也是我個人所推薦的)。也可以就把這個默認(rèn)的“首頁”修改,我也曾經(jīng)接到過這樣的需求,就是不要默認(rèn)亂七八糟的,就讓discuz.htm來呈現(xiàn)一個列表(支持翻頁和篩選),當(dāng)然還有周圍一些聚合信息。

原理很簡單,用SQL獲取數(shù)據(jù)庫主題表的數(shù)據(jù),然后通過分頁和相應(yīng)的約束條件實(shí)現(xiàn)翻頁和篩選,這里就涉及到兩個參數(shù)——翻頁的和篩選的;我們不妨以page和type為例;這個需求太常規(guī)了,一般人都不會出問題。

—————————————-這中間看故事而已,可略過—————————————-

是的,確實(shí)不會出問題,但是如果你忽略了DZ的緩存,那么有可能就會出問題,而且這個問題可以讓你摸不著邊。因?yàn)檫@個問題就是緩存,而且后臺是可以設(shè)置的,后臺設(shè)置太多了,后臺操作人員可能隨意一個設(shè)置就會導(dǎo)致很難被追蹤到的問題。這里還得說說曾經(jīng)的一個故事:

使用上面說到的把discuz.htm改成單純的聚合頁面,也就有了page和type兩個動態(tài)參數(shù),在默認(rèn)情況下直接這樣這個小的模塊在程序上很快就能完成,其他就是頁面干的事情了,開發(fā)環(huán)境OK,測試環(huán)境OK,生產(chǎn)環(huán)境OK。等一等,有問題,怎么當(dāng)用戶未登錄的時候翻到第二頁還是還是第一頁,而且點(diǎn)擊精華篩選也沒用啊。這樣的問題可以說很郁悶,因?yàn)榇a是一樣的、服務(wù)器環(huán)境是一樣,當(dāng)然數(shù)據(jù)庫數(shù)據(jù)可能不一樣(至少生產(chǎn)一直在創(chuàng)造內(nèi)容呀)。

當(dāng)然這是我收到的一個問題需求,我一開始想到當(dāng)然不是什么問題,就是想以最快的方式解決問題,于是肯定就問測試和生產(chǎn)有什么差異,生產(chǎn)以前是否正常。結(jié)果得到回復(fù)是以前沒問題,突然有問題,然后還說除了偽靜態(tài)那個地方做了一個僅游客有效外其他都沒做改變。這個時候我就納悶了。

后來,我突然想起來,最近他們因站點(diǎn)慢,做了一些處理,我就在想啊,Discuz本身就有緩存處理機(jī)制,如果他們涉及站點(diǎn)效率的問題,那么就基本上緩存相關(guān)的配置也在相應(yīng)的范圍內(nèi)。

—————————————-故事結(jié)束,請認(rèn)真聽—————————————-

于是就回到了標(biāo)題的問題,為什么在游客狀態(tài)下無效,我自然想到了緩存。然后我就直接看關(guān)于discuz.htm對應(yīng)的M層,也就是module了,對應(yīng)的文件為source/module/forum/forum_index.php。在這個文件中一開始就能看到這么一段代碼

if(!$_G['uid'] && !$gid  && $_G['setting']['cacheindexlife'] && !defined('IN_ARCHIVER') && !defined('IN_MOBILE')) {
	get_index_page_guest_cache();
}

其中的$_G['uid'] 和$_G['setting']以及get_index_page_guest_cache()讓我意識到我的猜想是正確的,因?yàn)榫驮谶@里我就看到了關(guān)于用戶的判斷(前面不是說只有未登錄用戶才會這樣么),$_G['setting']一般地后臺就能設(shè)置(也就是說他們出現(xiàn)問題就是后臺改變了,所以生產(chǎn)和測試環(huán)境不一樣的結(jié)果),而后面的方法則很明顯是緩存,根據(jù)命名顧名思義就是關(guān)于首頁頁面的游客緩存。于是查看這個方法,這個方法就在這個文件中,代碼如下

function get_index_page_guest_cache() {
 global $_G;
 $indexcache = getcacheinfo(0);
 if(TIMESTAMP - $indexcache['filemtime'] > $_G['setting']['cacheindexlife']) {
 @unlink($indexcache['filename']);
 define('CACHE_FILE', $indexcache['filename']);
 } elseif($indexcache['filename']) {
 @readfile($indexcache['filename']);
 $updatetime = dgmdate($indexcache['filemtime'], 'H:i:s');
 $gzip = $_G['gzipcompress'] ? ', Gzip enabled' : '';
 echo "<script type=\"text/javascript\">
 if($('debuginfo')) {
 $('debuginfo').innerHTML = '. This page is cached at $updatetime $gzip .';
 }
 </script>";
 exit();
 }
}

到了這里我就更加確信了我的判斷,于是我打開我本地隨便一個站點(diǎn),在后臺找$_G['setting']['cacheindexlife']這個設(shè)置項(xiàng),雖然我不喜歡在后臺折騰太多,但因?yàn)閷iscuz的熟悉,很快就能找到相應(yīng)的設(shè)置。

ds

那么解決方案呢?

我覺得解決有三個路徑,一個是停掉首頁的緩存,這對于大訪問量論壇可能不原因,壓力山大啊,小論壇直接關(guān)閉就好了(就是把上圖設(shè)置為0)。第二個方式就是新增一個頁面來做,然后訪問網(wǎng)站首頁直接定向到這個頁面,這個比如做一個插件之類的,這個不用多說。

第三種方式嘛,就是稍微修改一下M層,也就是上面的forum_index.php,修改上那段代碼即可,我們可以看到其中if中有!$gid,而gid這個參數(shù)就是我們訪問分區(qū)。也就是官方設(shè)計(jì)思想是什么呢?在首頁起始頁面如果我們開啟了緩存,就調(diào)用緩存頁面,而當(dāng)有參數(shù)gid的時候不緩存,我們也可以加上page和type參數(shù)有有效值的時候不緩存;這樣即可。同時我們可以繼續(xù)修改,比如說當(dāng)?shù)卿浀挠脩粢舱埱缶彺骓撁妫?dāng)然這樣做我不是特別喜歡,畢竟動了核心的源代碼。

與我們的項(xiàng)目經(jīng)理聯(lián)系
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

轉(zhuǎn)載請注明出處:Discuz緩存造成為登錄用戶/游客不能翻頁問題淺析 - 微構(gòu)網(wǎng)絡(luò)
分享:
標(biāo)簽: