織夢(mèng)dedecms程序里面,有很多的地方都用到了緩存。
在織夢(mèng)dedecms里面,不但存在模板緩存,重要數(shù)據(jù)的文件緩存。而且還引入了memcache緩存。首先我們看織夢(mèng)dedecms的cache.helper.php,這個(gè)文件里面的函數(shù)主要有三個(gè)。 SetCache(),GetCache(),DelCache()三個(gè)關(guān)于dedecms緩存的操作函數(shù)。
織夢(mèng)dedecms緩存主要存在文件緩存和memcache緩存兩種。當(dāng)后臺(tái)配置了memcache服務(wù)器信息的時(shí)候。dedecms cache他會(huì)優(yōu)先的選擇使用memcache來緩存,如果不存在memcache服務(wù)器配置信息。那么將起用dedecms的文件緩存方式。
首先我們看dedecms的SetCache()。很簡(jiǎn)單, function SetCache($prefix, $key, $value, $timeout = 3600, $is_memcache = TRUE),我們先看這條,他就是通過使用key/value的方式來設(shè)置dedecms的緩存,而$prefix更多的是前綴,而$key就是通過對(duì)md5($sql)的一串字符串獲取的。通過分析我們可以看出
if (! empty ( $cache_helper_config['memcache'] ) && $cache_helper_config['memcache'] ['is_mc_enable'] === 'Y' && $is_memcache === TRUE)
這段代碼告訴我們,如果你是存在memcache服務(wù)器,并且該服務(wù)器可用。那么將優(yōu)先使用memcache緩存。$result = $GLOBALS ['mc_' . $mc_path ['host']]->set ( $key, $value, MEMCACHE_COMPRESSED, $timeout ),通過設(shè)置memcache來完成對(duì)sql數(shù)據(jù)庫(kù)查詢的緩存。如果不存在,那么將起用dedecms的文件緩存。
$key = substr ( $key, 0, 2 ) . '/' . substr ( $key, 2, 2 ) . '/' . substr ( $key, 4, 2 ) . '/' . $key;
$tmp ['data'] = $value;
$tmp ['timeout'] = time () + ( int ) $timeout;
$cache_data = "<?php exit('dedecms');?>\n\r".@serialize ( $tmp );
return @PutFile ( DEDEDATA . "/cache/$prefix/$key.php", $cache_data);
在這里我們可以很清楚的認(rèn)識(shí)到。如果dedecms應(yīng)該說是結(jié)合的文件和memcache緩存兩種方式的,為了防止緩存文件被盜用,我們可以在緩存文件的前頭增加exit字符。當(dāng)你需要使用的時(shí)候,完全可以替換掉,當(dāng)正常的變量還原。
而dedecms緩存的key和緩存文件目錄的生成,是通過對(duì)md5($key)后的值取某幾個(gè)字符來做文件夾生成目錄的。這樣的好處是避免了很多緩存文件在指定的某幾個(gè)緩存目錄里面,造成緩存負(fù)荷太大,而影響緩存。
而取的dedecms的緩存的方式主要以下方式 function GetCache($prefix, $key, $is_memcache = TRUE)
我們可以分析出,當(dāng)$key=md5($key)之后,先去memcache中取得,如果不存在,那么才考慮去dedecms的文件緩存中獲取。
而織夢(mèng)dedecms刪除緩存也一樣, function DelCache($prefix, $key, $is_memcache = TRUE)先刪除memcache中的。
如果他不存在。將直接在織夢(mèng)dedecms文件緩存中刪除,最終完成dedecms整套緩存體系。