简介:这是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表里取数据。


不过这里取的只是一些系统缓存。还不清楚其它数据是怎么取的。改天继续研究吧。



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