返回首页 | 设为主页 | 加入收藏 | 公司招聘 | 文档下载 | 网站地图
自有平台
南京普谷网络为你提供基于PHP+MYSQL的企业网站建设、电子商务网站、大型WEB项目开发、DEDECMS、PHPCMS、PHP168、UCHOME、DISCUZ等主流开源系统二次开发!
DiscuzX 1.5缓存系统流程之cachedate函数介绍
DiscuzX 1.5缓存系统流程之cachedate函数介绍
发布者:admin   发布时间: 2010-10-01 17:09 浏览次数:

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缓存系统流程

DiscuzX 1.5缓存系统流程之discuz_memory内基本介绍

Copyright © 2010-2012 www.leaphp.com, All Rights Reserved
地址:中国· 南京 白下路111号洪宇商务中心8310室
苏ICP备08012533号