掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
雖說現(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è)置。
那么解決方案呢?
我覺得解決有三個路徑,一個是停掉首頁的緩存,這對于大訪問量論壇可能不原因,壓力山大啊,小論壇直接關(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)然這樣做我不是特別喜歡,畢竟動了核心的源代碼。
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流