搗鼓了幾天discuz的緩存,弄出了些頭緒,效率真低,2333333~~~~
discuz可以使用多種緩存,這裡只說數據緩存。 discuz支援redis、memcache等快取方式,只要在/config/config_global.php裡設定一下,而且環境支援就可以使用了。
其實讀寫快取還是比較簡單的,程式碼如下:
require_once libfile('function/cache'); //加载缓存类 savecache($cachename, $data); //写缓存 loadcache('plugin_fahao_kflist'); //读缓存,将缓存写到$_G变量中,通过读取$_G['cache']来获取缓存数据。
其中savecache()將資料寫到設定的快取中(如memcacheredisxpcsys等),並會將快取記錄到表中記錄到資料表中。
使用loadcache()時,會調用table_common_syscache類裡的fetch_all方法來獲取緩存,1、首先判斷是否設定了內存緩存,若是,讀取內存緩存的數據,存在數據直接返回,不存在及沒設定記憶體快取則進入第2步。 2.接著判斷是否設定了檔案緩存,若是,讀取檔案快取數據,存在數據直接返回,不存在及沒設定檔案快取則進入第3步。 3.讀取common_syscache表的資料並回傳。 (所以清除緩存時要兼顧到這幾方面)
關鍵在於清除緩存,在 全局->性能優化->內存優化 是可以做一些設置優化,在內存緩存管理也可以直接清除指定緩存。但對於自訂的快取需要自行開發功能清除。我的環境是開啟了memcache緩存,然後用系統自帶的memory()函數清除緩存,但是使用loadcache()讀取資料時發現緩存仍然存在。原因是memory()可以清除memcache的數據,但是沒有清除commom_syscache表的,所以loadcache()時依舊存在。後來查了一下發現了deletegroupcache()函數。為了適應全局,自已在/source/function/function_core.php裡簡單寫了deletecache()函數。代碼如下:
function deletecache($cachenames) { if(!empty($cachenames)) { C::t('common_syscache')->delete($cachenames); } }
以上就介紹了在discuz裡使用資料緩存,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。