商会资讯

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博连接

一步搞定

搜索
热搜: 活动 交友 discuz

Discuz X缓存机制浅析 第一版

已有 2208 次阅读2010-6-17 15:30 |个人分类:discuz

cachedata()
php 代码:
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;
 
收藏 分享邀请 转发到微博 举报

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

回顶部