聊聊discuz緩存機制

Discuz!的緩存同樣分了主動緩存和被動緩存。從功能上來說,主動緩存一般用到管理員對全站的設置,等等需要手動更新的地方,這些地方的數據都有一個 特點,那就是它們的更新可能性很小,平時不需要自動更新;Discuz!的被動緩存,一般分佈在諸如帖子內容顯示,用戶信息更新這些地方,這些地方的更新 基本上都是因爲用戶使用了某一特定的功能時所激發的。
 
在正常運行的Discuz!系統文件夾裏面會有一個forumdata文件夾,這個是論壇記錄和緩存文件的存放目錄,一般這些文件都是自動生成的,在 forumdata/cache/裏面存儲的都是一些Discuz!的基本設置和一些常使用的值,這些值一般在系統初始化的時候就保存在$_DCACHE 全局變量中,在後面的操作中將可以簡單地使用它們進行功能上的判斷。
 

 
(1)主動緩存,也就是隻在用戶操作後臺時,由Discuz!系統去刪除原有緩存進行更新的緩存。它們普遍存在於forumdata/cache/目錄 中,比如說/forumdata/cache/cache_settings.php保存了整個系統的核心設置,一般情況是不會更新的,只有後臺修改了比 如站點名稱等關鍵信息的時候纔會去主動更新這個緩存文件。還有用於保存用戶組和管理員組相關信息的兩類緩存文件:
 
/forumdata/cache/usergroup_’.intval($groupid).’.php
 
/forumdata/cache/admingroup_’.intval($adminid).’.php
 
另外還有在index、forumdisplay、viewthread、post、blog、topicadmin、register、 archiver幾個模塊中的時候分別會使用的cache_’模塊名‘.php的緩存。在include/common.inc.php中的流程可以看 到,這些類似的主動緩存都有一個特點:統一進行引用(include),最後進行失敗檢測,最後再對失敗的緩存(比如說文件丟失或者是上次更新還沒生成這 樣的情況下)統一進行重新生成的操作,具體的生成方法見/include/cache.func.php中的updatecache函數。
 
(2)被動緩存,也就是緩存的生成並非是由用戶手動更新的,而是在系統裏判斷是否需要生成緩存,需要緩存多長時間,由系統自身來完成整個過程。很典型的代 表有帖子內容的緩存生成過程。帖子內容的緩存路徑被cache_setting.php裏定義爲一個可以由用戶修改的值,默認是在 forumdata/threadcaches下,由viewthread.php裏的邏輯可以看到,當滿足使用緩存條件的時候(一般情況是第一頁的內 容),系統會執行viewthread_loadcache函數,此函數會判斷緩存是否過期,如果不過期就執行函數中間讀取緩存的操作,最後 Discuz!直接巧妙地在函數中die出一段javaScript,結束訪問。專研Discuz!代碼的你可能會很疑惑,究竟是什麼時候生成的緩存 呢?include文件夾裏有一個global.func.php,這個文件包括了整個Discuz!系統使用到的全局方法,其中有一個叫output的 函數,在函數裏判斷了是否可以緩存當前的頁面,並且使用ob_get_contents函數直接緩存頁面。
 
提示:ob_start()在服務器打開一個緩衝區來保存所有的輸出。所以在任何時候使用echo ,輸出都將被加入緩衝區中,直到程序運行結束或者使用ob_flush()來結束。然後在服務器中緩衝區的內容纔會發送到瀏覽器,由瀏覽器來解析顯示。函 數ob_end_clean 會清除緩衝區的內容,並將緩衝區關閉,但不會輸出內容。此時得用一個函數ob_get_contents()在ob_end_clean()前面來獲得緩 衝區的內容。這樣的話, 能將在執行ob_end_clean()前把內容保存到一個變量中,然後在ob_end_clean()後面對這個變量做操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章