DiscuzX 1.5缓存系统流程之cachedate函数介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
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; } |