2024国产成人精品免费视频|日本免费一区二区三区毛片|久久97超碰色中文字幕|亚洲天堂a中文字幕

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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();
 }
}

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

ds

那么解決方案呢?

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

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

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

我們?cè)谖⑿派?4小時(shí)期待你的聲音

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

轉(zhuǎn)載請(qǐng)注明出處:Discuz緩存造成為登錄用戶/游客不能翻頁(yè)問題淺析 - 微構(gòu)網(wǎng)絡(luò)
分享:
標(biāo)簽:
海林市| 通许县| 曲阜市| 化德县| 革吉县| 莎车县| 黑河市| 平遥县| 宣恩县| 郓城县| 卓尼县| 定兴县| 横峰县| 西林县| 区。| 唐山市| 神池县| 乐安县| 防城港市| 隆子县| 江源县| 建宁县| 赤峰市| 嘉荫县| 普安县| 苍南县| 澜沧| 礼泉县| 咸丰县| 盐边县| 宜都市| 万源市| 邻水| 长沙市| 淮安市| 会东县| 龙山县| 延津县| 玉屏| 五家渠市| 同心县|