分享

PHPCMS 缓存分析

 arm_embed 2012-08-08

PHPCMS 缓存分析

在common.inc.php页面有这样的一行:

if(CACHE_PAGE && !defined(’IN_ADMIN’)) cache_page_start();

它根据用户的设置选择是否开始缓存,用户登录后台后通过:网站配置=》性能优化选项,可选择是否启用PHP页面自动缓存功能。如果用户设置了启用缓存且用户不在后台就会执行cache_page_start()函数,cache_page_start()函数在global.func.php页面。与缓存相关的代码函数如下:

PHP语言: PHPCMS2008缓存分析<?php
//php CMS所有的模块就是如此结构, 先看是事原来有缓存,无则生成数据和cahce,然后将数据刷入模板,然后展示出来….
function cache_page_start()
{
define(‘CACHE_PAGE_ID’, md5(RELATE_URL));//定义cache文件的id,其中RELATE_URL在common.inc.php文件中定义
define(‘CACHE_PAGE_DIR’, CACHE_PAGE_PATH.substr(CACHE_PAGE_ID, 0, 2).‘/’);//页面缓存配置(config.inc.php)
define(‘CACHE_PAGE_FILE’, CACHE_PAGE_DIR.CACHE_PAGE_ID.‘.html’);//定义Cache文件
$contents = @file_get_contents(CACHE_PAGE_FILE);//加载Cache文件
if($contents && intval(substr($contents, 15, 25)) > TIME)//判断Cache文件是否过期,如果没有过期输出
{
echo substr($contents, 29);
exit;
}
return true;
}

//生成Cache文件
function cache_page($ttl = CACHE_PAGE_TTL, $isjs = 0)
{
if($ttl == 0 || !defined(‘CACHE_PAGE_FILE’)) return false;//如果传入的参数为0或者未定义CACHE_PAGE_FILE常量返回错误
$contents = ob_get_contents();//得到缓冲区的数据
if($isjs) $contents = format_js($contents);//读入数据,格式化js
dir_create(CACHE_PAGE_DIR);//创建Cache目录
$contents = “<!–expiretime:”.(TIME + $ttl).“–>\n“.$contents;//设置文件最后的修改时间,以防同样的访问,再次生成cahce
file_put_contents(CACHE_PAGE_FILE, $contents); //将cache文件内容写入cahce_file_name文件中
@chmod(CACHE_PAGE_FILE, 0777);//设置cahe目录的可读性,
}

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);//遍历删除文件夹
}
}

function cache_count($sql)//统计cache的更新时间和并写到数据库,比如更新时间,更新了多少次
{
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;
}

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\nreturn “.var_export($array, true).“;\n?>”;
$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);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多