您的位置:首页 > 其它

discuz x 1.5缓存机制分析

2011-11-17 10:57 337 查看
简介:这是discuz x 1.5缓存机制分析的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。

class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=325737' scrolling='no'>
前面分析了DZX的执行流程,里面提到,在调用模板前DZ会准备好数据,而模板被编译后就会去取准备好的数据。这篇文件主要分析下,DZ是如果保存准备好的数据的。即数据的缓存。
dzx首先会去数据库里取到所需要的数据,然后调用source\function\function_core.php里的memory方法处理缓存。其中memory方法支持三种缓存的处理方式,get,set,rm,get方式会从缓存里取数据,set方式将数据存入缓存,而rm方式则是删除缓存里的数据。当dzx取到数据时,首先会调用memory方法的set操作,把数据保存在内存里。这个保存过程是怎样的呢?
memory方法里调用了discuz_memory(source\class\class_core.php文件中)类的get set rm方法,而这三个方法接着调用了discuz_memcache类的对应方法,discuz_memcache类又调用了Memcache类的方法,Memcache继承自MemcachePool。我个人觉得DZ最后应该是用到memcached这个开源的缓存系统了,不过不明白的是,Memcache和MemcachePool类的get set等方法均没有实现,只有一个空函数。我的电脑也没装过memcached,还没弄清楚是怎么回事。
保存进缓存后,再取出来就方便了,如:
$ret = memory('get', 'forum_index_page_'.$groupid);

下面再讲一点,对每次请求,DZX怎么知道要准备哪些数据呢?这主要是在上文讲到的几个入口文件里定义的。
对于广场(论坛)模块,就定义在forum.php里。

//这个变量保存了所有论坛模块里要用到的需要初始化的数据
$modcachelist = array(
'index'		=> array('announcements', 'onlinelist', 'forumlinks', 'advs_index',
'heats', 'historyposts', 'onlinerecord', 'userstats'),
'forumdisplay'	=> array('smilies', 'announcements_forum', 'globalstick', 'forums',
'icons', 'onlinelist', 'forumstick','threadtable_info', 'threadtableids', 'stamps'),
'viewthread'	=> array('smilies', 'smileytypes', 'forums', 'usergroups', 'ranks',
'stamps', 'bbcodes', 'smilies',	'custominfo', 'groupicon', 'stamps',
'threadtableids', 'threadtable_info'),
'post'		=> array('bbcodes_display', 'bbcodes', 'smileycodes', 'smilies', 'smileytypes',
'icons', 'domainwhitelist'),
'space'		=> array('fields_required', 'fields_optional', 'custominfo'),
'group'		=> array('grouptype'),
);

//默认mod是index
$mod = !in_array($discuz->var['mod'], $modarray) ? 'index' : $discuz->var['mod'];

define('CURMODULE', $mod != 'redirect' ? $mod : 'viewthread');
$cachelist = array();
if(isset($modcachelist[CURMODULE])) {
//默认这里$cachelist = $modcachelist['index'];
$cachelist = $modcachelist[CURMODULE];
}
if($discuz->var['mod'] == 'group') {
$_G['basescript'] = 'group';
}

//初始化缓存时会完成$modcachelist['index']中所有列出的功能点的数据的初始化
$discuz->cachelist = $cachelist;
$discuz->init();

source\class\class_core.php中的discuz_core的_init_setting方法中有句话:
!empty($this->cachelist) && loadcache($this->cachelist);

这个loadcache就会完成所有$cachelist中列出的需要数据的初始化工作。loadcache最后会调用到source\function\function_core.php的cachedata方法,cachedata会去common_syscache表里取数据。
不过这里取的只是一些系统缓存。还不清楚其它数据是怎么取的。改天继续研究吧。

可能写的有不对的地方,欢迎指正。

“discuz x 1.5缓存机制分析”的更多相关文章 》

爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具
http://biancheng.dnbcw.info/php/325737.html pageNo:13
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: