当前位置:无线网络首页 >> 软件开发 >> PHPCMS2008源码浅析
PHPCMS2008源码浅析 (4)
2009-07-21 16:39:54  作者:merlang  来源:数码人家整理  浏览次数:2207  文字大小:【】【】【

PHPCMS2008源码浅析之cache原理一 global.inc.php

a.页面缓存,在后台 网站配置-》性能优化中,配置了启用PHP页面缓存

if(CACHE_PAGE && !defined('IN_ADMIN')) cache_page_start();  //看是否调用页面缓存

global.func.php 有如下函数

function cache_page_start()
{
        define('CACHE_PAGE_ID', md5(RELATE_URL));  
         //定义cache文件的id,其中RELATE_URL在,common.inc.php  中
         //define('RELATE_URL', isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : SCRIPT_NAME.(QUERY_STRING ? '?'.QUERY_STRING : PATH_INFO));
         //把本身的url+它get后的参数,两者md5加密,用来查找和生成cache-id
        
        define('CACHE_PAGE_DIR', CACHE_PAGE_PATH.substr(CACHE_PAGE_ID, 0, 2).'/');
        ////页面缓存配置(config.inc.php)
//define('CACHE_PAGE', 0); //是否开启PHP页面自动缓存功能
//define('CACHE_PAGE_PATH', PHPCMS_ROOT.'data/cache_page/'); //缓存存储路径
//define('CACHE_PAGE_TTL', 3600); //秒,缓存默认生命周期
//define('CACHE_PAGE_INDEX_TTL', 300); //秒,缓存默认生命周期
//define('CACHE_PAGE_CATEGORY_TTL', 600); //秒,缓存默认生命周期
//define('CACHE_PAGE_LIST_TTL', 900); //秒,缓存默认生命周期
/define('CACHE_PAGE_CONTENT_TTL', 14400); //秒,缓存默认生命周期
//PHPCMS_ROOT.'data/cache_page/+cacheid的前三位
        define('CACHE_PAGE_FILE', CACHE_PAGE_DIR.CACHE_PAGE_ID.'.html');  //加载cache文件
        $contents = @file_get_contents(CACHE_PAGE_FILE);
        if($contents && intval(substr($contents, 15, 25)) > TIME)  //判断是否过期,如果没有,就输出文件29个字符以后的所有文件
        {
                echo substr($contents, 29);
                exit;
        }
        return true;
}

//生成cahe文件
function cache_page($ttl = CACHE_PAGE_TTL, $isjs = 0)
{
        if($ttl == 0 || !defined('CACHE_PAGE_FILE')) return false;
        $contents = ob_get_contents();
        if($isjs) $contents = format_js($contents);   //读入数据,格式化js
        dir_create(CACHE_PAGE_DIR);
        $contents = "<!--expiretime:".(TIME + $ttl)."--> ".$contents;  //加上时间和超时时间,以到后面取的时候好对比
        file_put_contents(CACHE_PAGE_FILE, $contents);   //写入文件
        @chmod(CACHE_PAGE_FILE, 0777);
}

//清除所有的cache文件,也是data/cache_page下的文件
function cache_page_clear()
{
        @set_time_limit(600);
        $dirs = glob(CACHE_PAGE_PATH.'*');
        foreach($dirs as $dir)
        {
                $files = glob($dir.'/*');
                foreach($files as $file)
                {
                        @unlink($file);
                }
                @rmdir($dir);
        }
}

//统计cache的更新时间和并写到数据库,比如更新时间,更新了多少次
//$M = $TEMP = array();

function cache_count($sql)
{
        global $db, $TEMP;
        $id = md5($sql);
        if(!isset($TEMP['count'][$id]))
        {
                if(CACHE_COUNT_TTL)
                {
                        $r = $db->get_one("SELECT `count`,`updatetime` FROM `".DB_PRE."cache_count` WHERE `id`='$id'");
                        if(!$r || $r['updatetime'] < TIME - CACHE_COUNT_TTL)
                        {
                                $r = $db->get_one($sql);
                                $TEMP['count'][$id] = $r['count'];
                                $db->query("REPLACE INTO `".DB_PRE."cache_count`(`id`, `count`, `updatetime`) VALUES('$id', '".$r['count']."', '".TIME."')");
                        }
                }
                else
                {
                        $r = $db->get_one($sql);
                }
                $TEMP['count'][$id] = $r['count'];
        }
        return $TEMP['count'][$id];
}
//用户信息的cache文件,现在我还不知道什么意思
function cache_member()
{
        global $db;
        $status = $db->table_status(DB_PRE.'member_cache');
        if($status['Rows'] == 0)
        {
                @set_time_limit(600);
                $db->query("INSERT INTO `".DB_PRE."member_cache` SELECT * FROM `".DB_PRE."member`");
                return true;
        }
        return false;
}
//------------------------
//以上这些是页面cache的部分函数,其实也就是文本cache的一种方式 ,不过这个要在后台设置开启才行
//phpcms 2008默认是不开启,如上开关的,
//下面来介绍phpcms2008默认的文件cahce 模式


b.文件cahce
//在 global.ini.php中发现如下函数
//它的cache文件的目录是daba/cahce/下的很多x.php的文件,这些文件你可以打开看一下发现是一些生成好的数组文件
//平时在后台,点更新首页,其实也就是更新了这些变量,其中用到的var_export()这个php默认函数,大家可以看一下手册

function cache_read($file, $path = '', $iscachevar = 0)
{
        if(!$path) $path = CACHE_PATH;
        $cachefile = $path.$file;
        if($iscachevar)   //判断是否cache变量
        {
                global $TEMP;   //temp是全局性的临时变量,记录一些用户信息及配置信息,在commom.ini.php中有定义,
                $key = 'cache_'.substr($file, 0, -4);                      //去掉文件的后四位作为key,这个后四位暂时我也不明白,等后面分析
                return isset($TEMP[$key]) ? $TEMP[$key] : $TEMP[$key] = @include $cachefile;
        }
        return @include $cachefile;
}
//生成cache文件
function cache_write($file, $array, $path = '')
{
        if(!is_array($array)) return false;
        $array = "<?php return ".var_export($array, true)."; ?>";
        $cachefile = ($path ? $path : CACHE_PATH).$file;
        $strlen = file_put_contents($cachefile, $array);
        @chmod($cachefile, 0777);
        return $strlen;
}
//删除cache文件
function cache_delete($file, $path = '')
{
        $cachefile = ($path ? $path : CACHE_PATH).$file;
        return @unlink($cachefile);
}


这只是文本cache的部分东西

全部函数在 cache.func.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;
}
以上函数以后再说,今天到此,呵呵。。。

0

顶一下

0

踩一下
[1] [2] [3] [4] [5] [6] [7] [8] [9]
数码人家 | 版权声明 | 关于我们 | 友情链接 | 联系我们 | 广告服务 | 七年级下册

  • Copyright©2003-2018, 数码人家-网园 All Rights Reserved. 远山投姿欢迎您!
    陕ICP备05016083号-2
  •