1、 discuz緩存機制分析:php
使用緩存機制的目的很明顯,下降服務器性能的消耗,對於經常使用且變更比較小的數據的數據,能夠儘量的使用緩存來解決,代替最原生的不斷的進行數據庫查詢匹配的過程。而Discuz中提供的數據緩存方式包括內存、數據庫、文件三種方式,具體以下。java
(1)、項目根目錄/config/config_global.php配置數據庫/文件緩存方式,固然還有第三種,就是內存緩存。web
$_config['cache']['type'] = 'sql';//file
(2)、緩存數據獲取:redis
根目錄/source/function/function_core.php:sql
function loadcache($cachenames, $force = false) { global $_G; static $loadedcache = array(); $cachenames = is_array($cachenames) ? $cachenames : array($cachenames); $caches = array(); foreach ($cachenames as $k) { if(!isset($loadedcache[$k]) || $force) { $caches[] = $k; $loadedcache[$k] = true; } } if(!empty($caches)) { $cachedata = C::t('common_syscache')->fetch_all($caches); foreach($cachedata as $cname => $data) { if($cname == 'setting') { $_G['setting'] = $data; } elseif($cname == 'usergroup_'.$_G['groupid']) { $_G['cache'][$cname] = $_G['group'] = $data; } elseif($cname == 'style_default') { $_G['cache'][$cname] = $_G['style'] = $data; } elseif($cname == 'grouplevels') { $_G['grouplevels'] = $data; } else { $_G['cache'][$cname] = $data; } } } return true; }
從函數中能夠看出,數據緩存其實至關於把一些經常使用的數據,經過特定的需求,根據緩存的方式存儲於文件 或者 表(前綴)_common_syscache 或者 內存中,當須要使用到某個類型的數據的時候,只須要在代碼中加入相似loadcache('setting');,就能夠獲取到緩存數據並賦值於自定義全局變量$_G中,即$_G['setting']; ,其中fetch_all中會判斷當前使用的是哪種緩存方式,以下該函數:數據庫
腳本:table_common_syscache.php緩存
public function fetch_all($cachenames) { $data = array(); $cachenames = is_array($cachenames) ? $cachenames : array($cachenames); if($this->_allowmem) { $data = memory('get', $cachenames); $newarray = $data !== false ? array_diff($cachenames, array_keys($data)) : $cachenames; if(empty($newarray)) { return $data; } else { $cachenames = $newarray; } } if($this->_isfilecache) { $lostcaches = array(); foreach($cachenames as $cachename) { if(!@include_once(DISCUZ_ROOT.'./data/cache/cache_'.$cachename.'.php')) { $lostcaches[] = $cachename; } elseif($this->_allowmem) { memory('set', $cachename, $data[$cachename]); } } if(!$lostcaches) { return $data; } $cachenames = $lostcaches; unset($lostcaches); } $query = DB::query('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field('cname', $cachenames)); while($syscache = DB::fetch($query)) { $data[$syscache['cname']] = $syscache['ctype'] ? unserialize($syscache['data']) : $syscache['data']; $this->_allowmem && (memory('set', $syscache['cname'], $data[$syscache['cname']])); if($this->_isfilecache) { $cachedata = '$data[\''.$syscache['cname'].'\'] = '.var_export($data[$syscache['cname']], true).";\n\n"; if(($fp = @fopen(DISCUZ_ROOT.'./data/cache/cache_'.$syscache['cname'].'.php', 'wb'))) { fwrite($fp, "<?php\n//Discuz! cache file, DO NOT modify me!\n//Identify: ".md5($syscache['cname'].$cachedata.getglobal('config/security/authkey'))."\n\n$cachedata?>"); fclose($fp); } } } foreach($cachenames as $name) { if($data[$name] === null) {