Discuz!的緩存同樣分了主動緩存和被動緩存。從功能上來說,主動緩存一般用到管理者對全站的設定,等等需要手動更新的地方,這些地方的資料都有一個 特點,那就是它們的更新可能性很小,平時不需要自動更新;Discuz!的被動緩存,一般分布在諸如文章内容顯示,使用者資訊更新這些地方,這些地方的更新 基本上都是因為使用者使用了某一特定的功能時所激發的。
在正常運作的Discuz!系統檔案夾裡面會有一個forumdata檔案夾,這個是論壇記錄和緩存檔案的存放目錄,一般這些檔案都是自動生成的,在 forumdata/cache/裡面存儲的都是一些Discuz!的基本設定和一些常使用的值,這些值一般在系統初始化的時候就儲存在$_DCACHE 全局變量中,在後面的操作中将可以簡單地使用它們進行功能上的判斷。
<a href="http://blog.51cto.com/attachment/201304/170551908.jpg" target="_blank"></a>
(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()後面對這個變量做操作。
本文轉自許琴 51CTO部落格,原文連結:http://blog.51cto.com/xuqin/1184604,如需轉載請自行聯系原作者