赵荣涛's Archivers

From admin on 2011-09-07 00:08:09

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: