[TOC] # 缓存哪些数据 cache.php缓存了从数据库查询得到的以下数据。 1. 站点配置缓存 2. 用户信息缓存 3. 站点统计缓存 4. 最新评论缓存 5. 侧边栏标签缓存 6. 侧边栏分类缓存 7. 友情链接缓存 8. 友情链接分类缓存 9. 导航缓存 10. 最新文章 11. 最新微语 12. 文章归档缓存 13. 文章标签缓存 14. 文章分类缓存 15. 文章别名缓存 # 调用缓存方法 ``` $CACHE=Cache::getInstance(); $CACHE->updateCache(); $CACHE->readCache('sort'); $cacheData = serialize($sort_cache);//$sort_cache为数组 $CACHE->cacheWrite($cacheData,'sort'); ``` # 缓存文件 缓存机制位于include/lib/cache.php中,包括了2种缓存形式。 ## 1、文件缓存 #### (1)写入缓存文件 ``` /** * 写入缓存 */ function cacheWrite ($cacheData, $cacheName) { /* //使用sae memcached缓存打开注释,并删掉或屏蔽到该方法内所有代码。 $this->memcache->set($cacheName,$cacheData); */ $cachefile = EMLOG_ROOT . '/content/cache/' . $cacheName . '.php'; $cacheData = "<?php exit;//" . $cacheData; @ $fp = fopen($cachefile, 'wb') OR emMsg('读取缓存失败。如果您使用的是Unix/Linux主机,请修改缓存目录 (content/cache) 下所有文件的权限为777。如果您使用的是Windows主机,请联系管理员,将该目录下所有文件设为可写'); @ $fw = fwrite($fp, $cacheData) OR emMsg('写入缓存失败,缓存目录 (content/cache) 不可写'); $this->{$cacheName.'_cache'} = null; fclose($fp); } ``` #### (2)读取缓存文件 ``` /** * 读取缓存文件 */ function readCache($cacheName) { /* //使用sae memcached缓存打开注释,并删掉或屏蔽到该方法内所有代码。 if($this->memcache->get($cacheName)===false){call_user_func(array($this, 'mc_' . $cacheName));} $data = $this->memcache->get($cacheName); $this->{$cacheName.'_cache'} = unserialize($data); return $this->{$cacheName.'_cache'}; */ if ($this->{$cacheName.'_cache'} != null) { return $this->{$cacheName.'_cache'}; } else { $cachefile = EMLOG_ROOT . '/content/cache/' . $cacheName . '.php'; // 如果缓存文件不存在则自动生成缓存文件 if (!is_file($cachefile) || filesize($cachefile) <= 0) { if (method_exists($this, 'mc_' . $cacheName)) { call_user_func(array($this, 'mc_' . $cacheName)); } } if ($fp = fopen($cachefile, 'r')) { $data = fread($fp, filesize($cachefile)); fclose($fp); clearstatcache(); $this->{$cacheName.'_cache'} = unserialize(str_replace("<?php exit;//", '', $data)); return $this->{$cacheName.'_cache'}; } } } ``` ## 2、Memcached缓存 此方式是为了支持新浪SAE准备的,不再缓存之前文件缓存的数据,而缓存到了SAE Memcached缓存中。 使用方法只需将cache.php中注释Memcached的3处地方打开注释,并删掉旧代码即可。