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 = cachedata($caches); //读数据库缓存或者file缓存
foreach($cachedata as $cname => $data) {
$_G['cache'][$cname] = $data;
$cachearr = $_G['cache'][$cname];
}
}
return $cachearr;
function cachedata($cachenames) {
static $isfilecache, $allowmem;
if($isfilecache === null) {
$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);//通过memcached取值
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) {
//这里include缓存file
if(!@include_once(DISCUZ_ROOT.'./data/cache/cache_'.$cachename.'.php')) {
$lostcaches[] = $cachename;
}
}
//如果已经有file,则不走$lostcaches[] = $cachename,$lostcaches没值,直接return file中的$data。
if(!$lostcaches) {
return $data;
}
$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'];
//通过memcached存到内存里
$allowmem && (memory('set', $syscache['cname'], $data[$syscache['cname']]));
//创建file,数据存到file中
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;
}