DiscuzX 1.5缓存系统流程之cachedate函数介绍
function cachedata($cachenames) {
//定义一个静态变量,确定是否是使用文件缓存,以及是否允许使用内存缓存。即:xcache,memcache,acc
static $isfilecache, $allowmem;
if($isfilecache === null) {
//如果是第一次使用该函数,即$isfilecache未定义,则检查配置文件是否是FILE类型缓存。其实是检查$_G数组,因为配置已经加载到此数组中了
$isfilecache = getglobal('config/cache/type') == 'file';
//检查是否开启了内存缓存
$allowmem = memory('check');
}
$data = array();
//如果传过来的缓存类表是字符串形式转为数组
$cachenames = is_array($cachenames) ? $cachenames : array($cachenames);
if($allowmem) {
//如果允许内存缓存优化
$newarray = array();
foreach ($cachenames as $name) {
//执行内存缓存数据读取
$data[$name] = memory('get', $name);
if($data[$name] === null) {
//未读取到的缓存放入数组
$data[$name] = null;
$newarray[] = $name;
}
}
if(empty($newarray)) {
//如果缓存读取到了,则返回读取的值
return $data;
} else {
//如果缓存没读取到的话,在把失败的缓存重新放入待读取缓存列表,以便给接下来的程序继续尝试其他缓存读取
$cachenames = $newarray;
}
}
if($isfilecache) {
$lostcaches = array();
foreach($cachenames as $cachename) {
//如果包含缓存文件失败,则放入数组,标志该缓存读取失败
if(!@include_once(DISCUZ_ROOT.'./data/cache/cache_'.$cachename.'.php')) {
$lostcaches[] = $cachename;
}
}
if(!$lostcaches) {
//如果全部读取成功则结束函数,返回主程序
return $data;
}
//如果还有未读出的缓存,则交给下面的程序继续读取,使用SQL缓存方式读取
$cachenames = $lostcaches;
unset($lostcaches);
}
//从数据库中读取缓存
$query = DB::query("SELECT /*!40001 SQL_CACHE */ * FROM ".DB::table('common_syscache')." WHERE cname IN ('".implode("','", $cachenames)."')");
while($syscache = DB::fetch($query)) {
$data[$syscache['cname']] = $syscache['ctype'] ? unserialize($syscache['data']) : $syscache['data'];
//读取成功且内存缓存可用的话放入内存缓存
$allowmem && (memory('set', $syscache['cname'], $data[$syscache['cname']]));
//如果文件缓存可用的话,同时写入文件缓存
if($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)."\n\n$cachedata?>");
fclose($fp);
}
}
}
//通过以上处理,读取失败的配置已经全部写入文件缓存【如果允许】,现在在将缓存写入内存缓存【如果允许】
foreach ($cachenames as $name) {
if($data[$name] === null) {
$data[$name] = null;
$allowmem && (memory('set', $name, array()));
}
}
return $data;
}
查看完整版本: DiscuzX 1.5缓存系统流程之cachedate函数介绍
Tags: