dedecms負(fù)載性能優(yōu)化實(shí)例,三招讓你的dedecms快10倍以上
解決問題
對(duì)于list查詢來說,arc.typeid2='1′這個(gè)條件目的是查找某個(gè)文章所屬的第二分類,而事實(shí)上這個(gè)功能在大部分情況下很少使用,因?yàn)槲覀兇罂墒褂脴?biāo)簽(tag)來完成一篇文章的多個(gè)不同分類的歸屬,因此我們修改文件inc_arclist_view.php,在查詢語句中直接刪除了typeid2的條件判斷,并在pub_db_mysql.php中改進(jìn)了查詢執(zhí)行函數(shù)(主要用于提高sql語句執(zhí)行的效率,對(duì)最終結(jié)果影響不大),得到的最終測(cè)試結(jié)果如下,平均每個(gè)列表頁面的生成時(shí)間下講到不到1秒,3萬數(shù)據(jù)600個(gè)列表頁面生成只需要花費(fèi)不到10分鐘,優(yōu)化目標(biāo)達(dá)成。
優(yōu)化后的列表頁面生成速度
3.改進(jìn)文檔管理效率
問題提出
在90萬這個(gè)數(shù)據(jù)量的情況下,dedecms打開欄目文章列表,尤其是打開所有檔案列表企圖進(jìn)行文章管理的時(shí)候,速度簡(jiǎn)直無法讓人忍受。我們點(diǎn)擊所有文檔列表,耐著性子等了將近2分鐘,文章列表頁面才姍姍來遲。到底什么在制約著文章列表速度呢?
優(yōu)化前使用所有檔案列表數(shù)據(jù)加載完成時(shí)間
分析問題
控制顯示文檔列表的程序是dede/content_list.php和include/pub_datalist_dm.php,其中content_list.php是主控制程序,完成列表的參數(shù)傳遞和模板顯示,而pub_datalist_dm.php用于完成數(shù)據(jù)查詢和分頁等操作。通過程序調(diào)試,我們找到了問題的結(jié)癥在于pub_datalist_dm.php程序中對(duì)于全部數(shù)據(jù)的統(tǒng)計(jì)花費(fèi)了大量的時(shí)間,而使用limit的列表數(shù)據(jù)的查詢并不是性能的瓶頸。影響效率的關(guān)鍵代碼為:
$this->dsql->Query();
$this->totalResult = $this->dsql->GetTotalRow();
這里所用的數(shù)據(jù)總數(shù)統(tǒng)計(jì)的方式居然是通過content_list.php傳遞過來一個(gè)復(fù)雜的查詢語句,然后執(zhí)行這個(gè)查詢并將結(jié)果保存到數(shù)據(jù)集中,最后通過mysql_num_rows函數(shù)統(tǒng)計(jì)結(jié)果集中行的數(shù)目,完全沒有想到dedecms居然走了一個(gè)最遠(yuǎn)的路途完成一個(gè)最簡(jiǎn)單的操作,難怪效率低得可怕。因此只要我們改用最常見的count方法來統(tǒng)計(jì)數(shù)據(jù),執(zhí)行效率就能大幅提高。
解決問題
首先我們修改了程序content_list.php,構(gòu)造了$conutquery參數(shù)用來保存統(tǒng)計(jì)使用的SQL語句,代碼如下:
……
$conutquery=”
select count(*) as totalResult
from #@__archives
left join #@__arctype on #@__arctype.ID=#@__archives.typeid
left join #@__channeltype on #@__channeltype.ID=#@__archives.channel
left join #@__admin on #@__admin.ID=#@__archives.adminID
$whereSql
order by #@__archives.{$orderby} desc”;
……
然后將這個(gè)參數(shù)和查詢$query參數(shù)一起傳遞給pub_datalist_dm.php進(jìn)行處理。
$dlist->SetSource($query,$conutquery);
隨后將pub_datalist_dm.php中獲得數(shù)據(jù)總數(shù)統(tǒng)計(jì)的代碼替換為使用$conutquery參數(shù):
……
//統(tǒng)計(jì)優(yōu)化
$row = $this->dsql->GetOneSimple($this->countSql);
$this->totalResult = $row['totalResult'];
……
其中GetOneSimple是新構(gòu)造的一個(gè)用來執(zhí)行SQL語句的函數(shù),我把它放在了pub_db_mysql.php類里面,主要的用途就是返回SQL語句執(zhí)行結(jié)果, $this->countSql是上一個(gè)程序傳遞過來的統(tǒng)計(jì)使用的SQL代碼,$this->totalResult用來記錄數(shù)據(jù)統(tǒng)計(jì)結(jié)果。程序修改之后,獲得了滿意的效果。
優(yōu)化后使用所有檔案列表數(shù)據(jù)加載完成時(shí)間
總結(jié)
通過對(duì)以上幾步優(yōu)化操作,現(xiàn)在我們的程序后臺(tái)已經(jīng)能夠非常輕松的應(yīng)付90萬數(shù)據(jù)的管理和維護(hù)了,事實(shí)證明dedecms的負(fù)載性能的瓶頸并不是mysql、服務(wù)器或者操作系統(tǒng)平臺(tái)等,如果把未經(jīng)優(yōu)化的程序放到oracle的數(shù)據(jù)庫上,使用更高級(jí)別的服務(wù)器,使用freebsd的操作系統(tǒng),表現(xiàn)一樣會(huì)不盡如人意。細(xì)節(jié)決定成敗,看起來dedecms必須要在程序調(diào)優(yōu)、性能優(yōu)化上好好下功夫了。想了解更詳細(xì)的解決方案,請(qǐng)加入我們交流。
下面是其他網(wǎng)友的補(bǔ)充
前文介紹了DedeCMS欄目列表頁實(shí)現(xiàn)完美分頁的方法,避免了大部分重復(fù)欄目標(biāo)題對(duì)搜索引擎的影響,對(duì)SEO更有利。今天,分享一下DedeCMS數(shù)據(jù)負(fù)載性能優(yōu)化的方法。
接觸織夢(mèng)也有三年多時(shí)間了,對(duì)它可謂是又愛又恨。它的模板簡(jiǎn)單易用,標(biāo)簽調(diào)用更是靈活,二次開發(fā)也非常方便??墒?,站點(diǎn)數(shù)據(jù)龐大起來的時(shí)候(30多 萬條),后臺(tái)就會(huì)變得異常緩慢,生成HTML也很吃力,毫不夸張的說,頭發(fā)都等白了。這不禁讓我對(duì)DedeCMS數(shù)據(jù)負(fù)載性能產(chǎn)生了置疑?
查閱了相關(guān)資料,結(jié)合自身站點(diǎn)實(shí)際,還是總結(jié)出了一套不錯(cuò)的DedeCMS數(shù)據(jù)負(fù)載性能優(yōu)化方案。廢話不說,直接進(jìn)入正題。
1)數(shù)據(jù)分表存儲(chǔ) 減輕數(shù)據(jù)單表壓力
自織夢(mèng)V5版本起,DedeCMS開始分表存儲(chǔ)以提高系統(tǒng)負(fù)載性能,確實(shí)在一定程度上緩解了數(shù)據(jù)壓力?,F(xiàn)在最新的DedeCMS V5.7版本已經(jīng)出來了,據(jù)官方介紹,V5.7調(diào)整了緩存處理,應(yīng)付50萬以內(nèi)數(shù)據(jù)沒問題,至于真實(shí)性無從考究。如果官方陳述屬實(shí)的話,對(duì)于中小型站長(zhǎng)來 說確實(shí)是件好事,正常百萬級(jí)內(nèi)數(shù)據(jù)也不用過多擔(dān)心了。
分表存儲(chǔ)如何操作?
如果你只是個(gè)人或企業(yè)等小型站點(diǎn),數(shù)據(jù)量也就撐死上萬,那完全不用考慮分表存儲(chǔ),DedeCMS完全可以勝任。分表操作很簡(jiǎn)單,你只需要直接進(jìn)入后 臺(tái),新建模型,然后設(shè)置一個(gè)欄目對(duì)應(yīng)一個(gè)模型。個(gè)人建議一個(gè)大的頻道欄目及子欄目對(duì)應(yīng)一個(gè)模型,這要根據(jù)你的欄目可能存儲(chǔ)的數(shù)據(jù)來做計(jì)劃,考慮實(shí)際一點(diǎn)的 分表方案。
2)修改系統(tǒng)參數(shù) arclist標(biāo)簽另類優(yōu)化
在DedeCMS V5版本中,官方其實(shí)已經(jīng)做了極力優(yōu)化,引入了緩存機(jī)制。其實(shí)影響HTML生成速度的罪魁禍?zhǔn)走€是模板中的arclist標(biāo)簽,很多站長(zhǎng)喜歡用 arclist標(biāo)簽來調(diào)用最新、熱門、推薦、頭條等文章列表,但是arclist標(biāo)簽每次都帶著一大堆條件去主表中查詢,可能還會(huì)關(guān)聯(lián)附加表,對(duì)一次性生 成大量文章來說,只是重復(fù)使用arclist標(biāo)簽對(duì)數(shù)據(jù)庫重復(fù)查詢罷了,自然會(huì)花去大量時(shí)間?,F(xiàn)在DedeCMS新的版本中,生成HTML時(shí)arclist標(biāo)簽會(huì)直接調(diào)用緩存數(shù)據(jù),省去arclist標(biāo)簽重復(fù)查詢數(shù)據(jù)庫的時(shí)間,頓時(shí)讓上述工作變得輕松起來,生成速度得到提升也是必然的。你只用在系統(tǒng)參數(shù)->性能選項(xiàng)中,找到arclist標(biāo)簽調(diào)用緩存(cfg_index_cache)(0 不啟用,大于0值為多少秒),根據(jù)自身實(shí)際需求調(diào)整緩存調(diào)用時(shí)間。
其實(shí),還有一種解決辦法,就是麻煩了一些,但是對(duì)性能提升是非常顯著的。arclist 標(biāo)簽調(diào)用緩存雖說一定程度上提高了HTML生成速度,但是還是需要對(duì)arclist緩存進(jìn)行判斷,如果能把這部分時(shí)間也省去,那是不是會(huì)更快呢?答案是肯 定確定以及雙重否定。我們可以通過freelist(自由列表)功能事先生成最新、熱門、推薦、頭條等文章列表頁面,然后用include標(biāo)簽直接引入到 模板里,標(biāo)簽格式為:{dede:include file='文章列表頁面文件名稱' ismake=' no'/}。如果你的站長(zhǎng)數(shù)據(jù)很龐大,服務(wù)器硬件配置也一般的話,何不嘗試一下呢?
另外,系統(tǒng)參數(shù)-核心設(shè)置里默認(rèn)的關(guān)鍵字替換功能(cfg_keyword_replace)是開啟的,如果文章是采集過來的,還是關(guān)閉的好,有很多關(guān)鍵字都毫無意義,甚至?xí)衼y碼導(dǎo)致生成出錯(cuò),關(guān)掉此功能對(duì)提高系統(tǒng)性能是有一定幫助的。
3)數(shù)據(jù)庫表索引優(yōu)化 性能大幅提升
為什么要對(duì)DedeCMS數(shù)據(jù)庫表索引進(jìn)行優(yōu)化呢?很簡(jiǎn)單,在Mysql中,索引無疑是最有效的加快查詢的工具了,一個(gè)合理的索引組合會(huì)極大地提升 你的查詢效率和系統(tǒng)性能。言歸正傳,你可以通過phpmyadmin或是一個(gè)叫Navicat for MySQL的軟件(推薦)來管理你的數(shù)據(jù)庫。
分析DEDECMS數(shù)據(jù)表信息,不難發(fā)現(xiàn),所有的文章數(shù)據(jù)是存儲(chǔ)在dede_archives和dede_arctiny,以及對(duì)應(yīng)的 dede_addonarticle附加表中的。生成HTML時(shí),sql查詢主要圍繞這三張表來的。個(gè)人認(rèn)為,凡是要排序的字段和查詢條件的字段及文檔 ID都要建立索引,如果一個(gè)沒有建立,將會(huì)嚴(yán)重影響MySQL的查詢效率,最終導(dǎo)致生成速度變慢。DEDECMS數(shù)據(jù)表索引建立方法如下:
a)dede_archives,是文章的主表,存儲(chǔ)文章標(biāo)題、關(guān)鍵 字、描述、發(fā)布時(shí)間等信息,10萬數(shù)據(jù)的表大小可能在30MB左右,也是我們優(yōu)化的重點(diǎn)。你需要建立的索引字段有,id、channel、 pubdate、sortrank、ismake、typeid、mainindex、lastpost;其中,像系統(tǒng)默認(rèn)的mainindex和 lastpost這兩個(gè)組合索引,個(gè)人認(rèn)為存在意義不大,可以刪除,自己掂量。需要注意的是,click字段,是文檔的點(diǎn)擊數(shù),此字段更新頻率,建立索引 后會(huì)對(duì)系統(tǒng)維護(hù)帶來一定壓力,另外也有人說頻繁更新的建立索引會(huì)容易導(dǎo)致數(shù)據(jù)庫損壞,也無從查證。個(gè)人建議click字段保留,不建立索引。
b)dede_arctiny,這個(gè)表比較小,10萬數(shù)據(jù)的表大小不到5MB,建議不建立索引,可以將自帶的刪除掉,或者只保留sortrank索引。
c)dede_addonarticle,是文章附加表,主要是用來存儲(chǔ)文章內(nèi)容的,不作索引考慮。
以上索引成功建立后,再測(cè)試下你的HTML生成速度,是不是讓你精神一振呢?
4)搭建勝過Apache十倍的高并發(fā)Web服務(wù)器 Nginx + PHP(FastCGI)
Web服務(wù)器的重要性不需多言,對(duì)提升網(wǎng)站性能有著直接影響。在PHP開發(fā)中,最常用的環(huán)境莫過于在 LAMP:Linux+apache+mysql+php了,在windows下有 WAMP:Windows+apache/iis+mysql+php,我的WEB站點(diǎn)也是在這種環(huán)境下開發(fā)的。Nginx + PHP(FastCGI)無疑是你最好的選擇,在Windows和Linux下都可以安裝,只是Windows下的Nginx表現(xiàn)要遠(yuǎn)遠(yuǎn)遜色于Linux。
DedeCMS系統(tǒng)運(yùn)行是依賴PHP+MYSQL環(huán)境的,所以說一個(gè)運(yùn)行快、資源消耗小的Web服務(wù)器對(duì)提升系統(tǒng)性能有多重要。如果條件允許的條件,還是推薦下Nginx + PHP(FastCGI)這種WEB服務(wù)器環(huán)境。
以上就是DedeCMS數(shù)據(jù)負(fù)載性能的優(yōu)化方案,針對(duì)的是有獨(dú)立WEB服務(wù)器或控制權(quán)限的站長(zhǎng),至于虛擬主機(jī)想 達(dá)到這個(gè)速度還是很費(fèi)勁的,但是也可以作為DedeCMS性能優(yōu)化的一個(gè)參考依據(jù),自己琢磨琢磨了。當(dāng)然,如果有更好的提高DedeCMS數(shù)據(jù)負(fù)載性能的 辦法,還希望分享下。其實(shí),正常情況下(不包括采集),一般站點(diǎn)數(shù)據(jù)量也都有限,20萬就很了不起了吧?我想,以上的DedeCMS優(yōu)化方案足以解決了。 真到了百萬級(jí)、千萬級(jí)數(shù)據(jù)的時(shí)候,也不是一般站長(zhǎng)需要考慮的事了。
相關(guān)文章
dedecms織夢(mèng)系統(tǒng)數(shù)據(jù)庫表結(jié)構(gòu)詳細(xì)說明-附表名與字段名
dedecms織夢(mèng)系統(tǒng)是一個(gè)自由和開放源碼的內(nèi)容管理系統(tǒng),簡(jiǎn)單易用,功能豐富,原生php程序,二開簡(jiǎn)單,曾經(jīng)流行了好多年,就是現(xiàn)在還有人再使用。本文囊括了dedecms數(shù)據(jù)庫所有的86張數(shù)據(jù)表結(jié)構(gòu)和字段詳細(xì)說明,需要的朋友可以參考下。2023-04-04dedecms中如何在欄目列表和文章頁面中獲得當(dāng)前欄目標(biāo)題
我們?cè)谑褂胐edecms中會(huì)發(fā)現(xiàn),當(dāng)我們打開欄目的列表頁和文章頁的時(shí)候,無論我們使用什么標(biāo)簽,都無法獲得當(dāng)前欄目的標(biāo)題信息。究其原因是因?yàn)檫@兩個(gè)頁面所讀取的信息主要來源于dedecms的dede_archives表及其附加表,僅通過傳遞欄目的id編號(hào)來區(qū)別不同欄目,因此我們通過類似{dede:field name=’typename’/}這樣的方法是無法直接獲得欄目名稱的。但是我們依然可以通過程序的改造,利用欄目的唯一id編號(hào),獲得欄目名稱。以下是實(shí)現(xiàn)方法:2008-03-03Dedecms模板常用調(diào)用標(biāo)簽代碼整理
因?yàn)橐恢庇玫絛edecms的模板,特把經(jīng)常用到的調(diào)用標(biāo)簽代碼整理如下2008-05-05DEDECMS TAG偽靜態(tài) IIS_rewrite配置方法附rewrite下載
使dedecms出現(xiàn)的偽靜態(tài)效果實(shí)現(xiàn)代碼2008-10-10DeDecms中利用關(guān)鍵詞實(shí)現(xiàn)簡(jiǎn)單tag功能的php代碼
此方法的思路是直接調(diào)用dedecms每篇文章的關(guān)鍵詞,以此作為tag標(biāo)簽,在通過模板的編程為每個(gè)關(guān)鍵詞增加搜索鏈接,好處即為無需修改程序即可實(shí)現(xiàn)簡(jiǎn)單的tag標(biāo)簽功能,實(shí)現(xiàn)方法參考如下:2008-03-03dedecms v5 跳轉(zhuǎn)網(wǎng)址 直接鏈接而非跳轉(zhuǎn)的實(shí)現(xiàn)方法修正版
最近在使用dedecms建站的時(shí)候發(fā)現(xiàn)這個(gè)問題,如果調(diào)轉(zhuǎn)網(wǎng)址是直接的連接地址,效果就更好了,網(wǎng)上的版本有點(diǎn)來,我也是參考他們的整理出來的2008-07-07