你现在的位置:首页 > PHP网站建设知识库 > phpcms > 正文

phpcms代码分析 缓存机制:include/cache.func.php

<?php 
function cache_all()//缓存所有内容
{
    @set_time_limit(600);
    cache_common();
    cache_module();
    cache_model();
    cache_category();
    cache_area();
    cache_type();
    cache_member_group();
    cache_role();
    cache_author();
    cache_keyword();
    cache_copyfrom();
    cache_pos();
    cache_status();
    cache_workflow();
    tags_update();
    return TRUE;
}
function cache_common()//缓存常用
{
    global $db;
    $data = array();
    $result = $db->query("SELECT `module`,`name`,`path`,`url`,`iscore`,`version` FROM `".DB_PRE."module` WHERE `disabled`=0"); //查询所有模块
    while($r = $db->fetch_array($result))
    {
        if(!$r['path']) $r['path'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/'; //phpcms的安装路径是根目录,其它的模块为module英文名
        if(!$r['url']) $r['url'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/'; 
        $data[$r['module']] = $r;
    }
    $db->free_result($result); //释放资源
    $CACHE['MODULE'] = $data;  //放入$CACHE数组,$CACHE最后写入缓存文件
    $data = array();
    $result = $db->query("SELECT * FROM `".DB_PRE."model` WHERE `disabled`=0");  //缓存模型 
    while($r = $db->fetch_array($result))
    {
        $data[$r['modelid']] = $r;
    }
    $db->free_result($result);
    $CACHE['MODEL'] = $data;
    $data = array();
    //缓存栏目
    $result = $db->query("SELECT `catid`,`module`,`type`,`modelid`,`catname`,`style`,`image`,`catdir`,`url`,`parentid`,`arrparentid`,`parentdir`,`child`,`arrchildid`,`items`,`citems`,`pitems`,`ismenu`,`letter` FROM `".DB_PRE."category` WHERE 1 ORDER BY `listorder`,`catid`");
    while($r = $db->fetch_array($result))
    {
        $r['url'] = url($r['url']);
        $data[$r['catid']] = $r;
    }
    $db->free_result($result);
    $CACHE['CATEGORY'] = $data;
    $data = array();
    //缓存 分类
    $result = $db->query("SELECT `typeid`,`modelid`,`module`,`name`,`style`,`typedir`,`url` FROM `".DB_PRE."type` WHERE 1 ORDER BY `listorder`,`typeid`");
    while($r = $db->fetch_array($result))
    {
        $data[$r['typeid']] = $r;
    }
    $db->free_result($result);
    $CACHE['TYPE'] = $data;
    $data = array();
    //缓存 地区
    $result = $db->query("SELECT `areaid`,`name`,`style`,`parentid`,`arrparentid`,`child`,`arrchildid` FROM `".DB_PRE."area` WHERE 1 ORDER BY `listorder`,`areaid`");
    while($r = $db->fetch_array($result))
    {
        $data[$r['areaid']] = $r;
    }
    $db->free_result($result);
    $CACHE['AREA'] = $data;
    $data = array();
    // 缓存  url规则
    $result = $db->query("SELECT `urlruleid`,`urlrule` FROM `".DB_PRE."urlrule` WHERE 1 ORDER BY `urlruleid`");
    while($r = $db->fetch_array($result))
    {
        $data[$r['urlruleid']] = $r['urlrule'];
    }
    $db->free_result($result);
    $CACHE['URLRULE'] = $data;
    $data = array();
    //缓存phpcms模块的设置,setting内容为php格式数组。
    $r = $db->get_one("SELECT `setting` FROM `".DB_PRE."module` WHERE `module`='phpcms'");
    $setting = $r['setting'];
    eval("/$PHPCMS = $setting;");
    if($PHPCMS['siteurl'] =='') $PHPCMS['siteurl'] = SITE_URL;
    $CACHE['PHPCMS'] = $PHPCMS;
    cache_write('common.php', $CACHE); //把$CACHE内容写入缓存文件 data/cache/common.php
    return $CACHE;
}
//缓存 模块配置
function cache_module()
{
    global $db;
    $data = array();
    $result = $db->query("SELECT `module`,`name`,`path`,`url`,`iscore`,`version`,`publishdate`,`installdate`,`updatedate`,`setting` FROM `".DB_PRE."module` WHERE `disabled`=0");
    while($r = $db->fetch_array($result))
    {
        if(!$r['path']) $r['path'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/'; 
        if(!$r['url'])
        {
            $r['url'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/';
            $db->query("UPDATE `".DB_PRE."module` SET `url`='$r[url]' WHERE module='$r[module]' LIMIT 1");
        }
        if($r['setting'])
        {
            $setting = $r['setting'];
            eval("/$setting = $setting;"); //设置$setting内容为模块setting列的内容及路径信息
            unset($r['setting']);
            if(is_array($setting)) $r = array_merge($r, $setting);
        }
        cache_write('module_'.$r['module'].'.php', $r);  //将模块配置写入/ data/cahce/module_$module.php文件
    }
    $db->free_result($result);
}
function cache_model()
{
    cache_table(DB_PRE.'model', '*', '', '', 'modelid', 1);
}
function cache_category()
{
    cache_table(DB_PRE.'category', '*', '', '', 'listorder,catid', 1);
}
function cache_type()
{
    cache_table(DB_PRE.'type', '*', '', '', 'listorder,typeid', 1);
}
function cache_area()
{
    cache_table(DB_PRE.'area', '*', '', '', 'listorder,areaid', 1);
}
function cache_member_group()
{
    cache_table(DB_PRE.'member_group', '*', '', '', 'groupid', 1);
    cache_table(DB_PRE.'member_group', '*', 'name', '', 'groupid', 0);
}
function cache_role()
{
    cache_table(DB_PRE.'role', '*', 'name', '', 'listorder,roleid');
}
function cache_author()
{
    cache_table(DB_PRE.'author', '*', 'name', '', 'listorder,authorid', 0, 100);
}
function cache_keyword()
{
    cache_table(DB_PRE.'keyword', '*', 'tag', '', 'listorder,usetimes', 0, 100);
}
function cache_copyfrom()
{
    cache_table(DB_PRE.'copyfrom', '*', '', '', 'listorder,usetimes', 0, 100);
}
function cache_pos()
{
    cache_table(DB_PRE.'position', '*', 'name', '', 'listorder,posid', 0);
}
//缓存 稿件状态 ,写入/data/cache/status.php缓存文件s
function cache_status()
{
    global $db;
    $array = array();
    $result = $db->query("SELECT * FROM `".DB_PRE."status` ORDER BY `status` ASC");
    while($r = $db->fetch_array($result))
    {
        $array[$r['status']] = $r['name'];
    }
    cache_write('status.php', $array);
    return $array;
}
function cache_workflow()
{
    global $db;
    $array = array();
    $result = $db->query("SELECT * FROM `".DB_PRE."workflow` ORDER BY `workflowid` ASC");
    while($r = $db->fetch_array($result))
    {
        $array[$r['workflowid']] = $r['name'];
    }
    cache_write('workflow.php', $array);
    return $array;
}
function cache_formguid()
{
    cache_table(DB_PRE.'formguide', '*', '', '', 0);
}
//缓存 表数据
function cache_table($table, $fields = '*', $valfield = '', $where = '', $order = '', $iscacheline = 0, $number = 0)
{
    global $db;
    $keyfield = $db->get_primary($table); //获取主键
    $data = array();
    if($where) $where = " WHERE $where";
    if(!$order) $order = $keyfield;
    $limit = $number ? "LIMIT 0,$number" : '';
    $result = $db->query("SELECT $fields FROM `$table` $where ORDER BY $order $limit");
    $table = preg_replace("/^".DB_PRE."(.*)$/", "//1", $table); //去掉表名前缀
    while($r = $db->fetch_array($result))
    {
        if(isset($r['setting']) && !empty($r['setting'])) //如果有setting列且内容不为空,则行数据跟setting合并
        {
            $setting = $r['setting'];
            eval("/$setting = $setting;"); 
            unset($r['setting']);
            if(is_array($setting)) $r = array_merge($r, $setting);
        }
        $key = $r[$keyfield]; 
        $value = $valfield ? $r[$valfield] : $r; //是否为单列内容
        $data[$key] = $value;
        if($iscacheline) cache_write($table.'_'.$key.'.php', $value); //将内容写入缓存文件,文件名按表名(无前缀)_主键值.php,
    }
    $db->free_result($result);
    cache_write($table.'.php', $data);
}
//global.func.php 中的cache_write函数
function cache_write($file, $array, $path = '')
{
    if(!is_array($array)) return false;
    $array = "<?php/nreturn ".var_export($array, true).";/n?>"; //将php数组自动返回数组内容
    $cachefile = ($path ? $path : CACHE_PATH).$file;
    $strlen = file_put_contents($cachefile, $array); //写入缓存文件中
    @chmod($cachefile, 0777);
    return $strlen;
}