• discuz x 1.5缓存机制分析


    简介:这是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
  • 相关阅读:
    59、web框架以及Django框架
    58、bootstrap
    56、jQuery事件
    55、原生js事件与jQuery
    36-并发编程
    4.20---远程执行命令的CS架构软件
    35-socket 基于套接字的TCP与UDP
    34-网络编程
    33-异常处理
    4.15---元类练习
  • 原文地址:https://www.cnblogs.com/ooooo/p/2252340.html
Copyright © 2020-2023  润新知