




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Discuz! 的缓存机制缓存类型在DiscuzX中用到了模板缓存、文件缓存、数据缓存的缓存方法。Discuz X中,缓存核心函数在function_core.php和function_cache.php中。其中以updatecache和loadcache两个函数最为核心。模板缓存在Discuz产品中采用的是预编译的缓存机制,当程序调用模板过程中先去检测是否已经存在缓存,如果存在已编译后的模板文件,则直接调用编译的后的模板缓存。否则进行一次模板编译,工作原理如下: 文件缓存在configconfig_global.php中有这么一个配置 $_configcachetype = sql;/ 缓存类型 file=文件缓存, sql=数据库缓存当这个配置改成file时,Discuz生成的缓存将通过方法写入文件中。文件缓存存储在“datacache”目录下,使用文件缓存的好处是,当你的服务器存在MySQL压力较高时,可以通过file的缓存机制缓解MySQL的压力,这种的缓存机制是用服务器的IO来换取MySQL的读写频率。降低MySQL的压力。 生成的缓存文件存储方式如下: portal.php, holddomain = www|*blog*|*space*|*bbs*, list = array ( = array ( id = 1, idtype = subarea, ), ), app = array ( portal = , forum = , group = , home = , mobile = , default = , ), root = array ( home = , group = , forum = , topic = , channel = , ),);?这样在程序调用时直接引入缓存文件就可以调用了。 数据缓存目前Discuz!中支持的内存优化接口有 Memcache、eAccelerator、Xcache 三种,当你的服务器中安装了其中的任一一个缓存插件后,可以通过配置configconfig_global.php来开启缓存,配置项如下: /内存变量前缀, 可更改,避免同服务器中的程序引用错乱$_configmemoryprefix = discuz_;$_configmemoryeaccelerator = 1;/ 启动对 eaccelerator 的支持$_configmemoryxcache = 0;/ 启动对 xcache 的支持$_configmemorymemcacheserver = ;/ memcache 服务器地址$_configmemorymemcacheport = 11211;/ memcache 服务器端口$_configmemorymemcachepconnect = 1;/ memcache 是否长久连接$_configmemorymemcachetimeout = 1;/ memcache 服务器连接超时缓存原理 缓存更新原理如下 以下是缓存的工作原理,在开发过程中当你调用到缓存时,只需要确认你要使用的缓存名称,然后调用loadcache($cachenames, $force)就可以获取到你原先保存的缓存内容 缓存调用 缓存调用方式可以直接传给loadcache($cachenames, $force = false)一个缓存名称后就可以获取到缓存数据。例如: loadcache(plugin);执行上面的调用后就可以在$_Gcacheplugin中获取到相应的缓存数据 缓存更新,在你对相应的缓存数据操作完后只需要调用updatecache($cachename = ), 传给要更新的缓存名称,新的缓存数据就会通过相应的脚本生成新的缓存数据 例如: updatecache(plugin);下面举例说明。我们可以在后台的admincp_click.php,看到 updatecache(click),证明click是使用了缓存机制的。Click就是表态图标,头像什么的信息,路过,雷人,鸡蛋等等,这些信 息是基本不修改的,并且会在前台很多地方用到。而如果不使用缓存的话,则每次都需要遍历一次click表,而如果有100个表态图像的话则会读100次 库,每篇日志都会有click信息,如果有100篇日志则会读click表10000次。X的做法就是,把类似click表的内容,序 列化,存放在common_syscache表中,这样每次只需要读一次库,或者存放在文件中,每次都读这个文件。下面我们详细看看代码是怎么运行的。 我们这里模拟一个需要缓存的表message,只有两个字段,subject和content。当然 message这样的经常更新的数据是不适合缓存的,这里只是举例方便。Php代码 1. functionupdatecache($cachename=)2. 3. global$_G;4. 5. static$cachelist=array(message);/把需要缓存的数据名,可自己添加。6. 7. $updatelist=emptyempty($cachename)?$cachelist:(is_array($cachename)?$cachename:array($cachename);8. foreach($updatelistas$value)9. getcachearray($value);/填充缓存数据10. 这里看看getcachearray()代码Php代码 1. functiongetcachearray($cachename,$script=)2. global$_G;3. 4. $cols=*;5. $conditions=;6. $timestamp=TIMESTAMP;7. switch($cachename)/根据缓存名称按要求写相关代码,什么需要缓存,什么不需要缓存,我这里的conditions用默认的,就是缓存全部数据。8. casemessage:9. $table=message;10. break;11. 12. 13. $data=array();14. $query=DB:query(SELECT$colsFROM.DB:table($table).$conditions);15. /读库,存为数组。16. switch($cachename)17. casemessage:18. while($row=DB:fetch($query)19. $datasubject$rowid=$rowsubject;20. $datacontent$rowid=$rowcontent;21. $datadateline$rowid=$rowdateline;22. 23. 24. save_syscache($cachename,$data);/序列化存到syscache表中。25. returntrue;26. 看看save_syscache()是干嘛的。Php代码 1. functionsave_syscache($cachename,$data)2. static$isfilecache,$allowmem;3. if($isfilecache=null)4. $isfilecache=getglobal(config/cache/type);/取缓存类型,是file,还是sql。5. $allowmem=memory(check);/判断是否使用Memcached6. 7. 8. if(is_array($data)9. $ctype=1;10. $data=addslashes(serialize($data);/序列化11. else12. $ctype=0;13. 14. /入库15. DB:query(REPLACEINTO.DB:table(common_syscache).(cname,ctype,dateline,data)VALUES($cachename,$ctype,.TIMESTAMP.,$data);16. 17. /memcached启用的话,清空缓存18. $allowmem&memory(rm,$cachename);19. /缓存file存在的话,删除文件20. $isfilecache&unlink(DISCUZ_ROOT./data/cache/cache_.$cachename.php);21. 总结一下updatecache()的作用,读原始库,这里是message表,序列化存到syscache表的一条记录,并且清空memcached缓存和缓存的file。Updatecache = getcachearray = save_syscache下面我们研究缓存模块的下半部分,loadcache();Php代码 1. functionloadcache($cachenames,$force=false)2. global$_G;3. static$loadedcache=array();4. $cachenames=is_array($cachenames)?$cachenames:array($cachenames);5. $caches=array();6. foreach($cachenamesas$k)7. if(!isset($loadedcache$k)|$force)8. $caches=$k;9. $loadedcache$k=true;10. 11. 12. 13. if(!emptyempty($caches)14. $cachedata=cachedata($caches);/读数据库缓存或者file缓存15. foreach($cachedataas$cname=$data)16. $_Gcache$cname=$data;17. $cachearr=$_Gcache$cname;18. 19. 20. return$cachearr;Php代码 1. functioncachedata($cachenames)2. static$isfilecache,$allowmem;3. 4. if($isfilecache=null)5. $isfilecache=getglobal(config/cache/type)=file;6. $allowmem=memory(check);7. 8. 9. $data=array();10. $cachenames=is_array($cachenames)?$cachenames:array($cachenames);11. if($allowmem)12. $newarray=array();13. foreach($cachenamesas$name)14. $data$name=memory(get,$name);/通过memcached取值15. if($data$name=null)16. $data$name=null;17. $newarray=$name;18. 19. 20. if(emptyempty($newarray)21. return$data;22. else23. $cachenames=$newarray;24. 25. 26. 27. if($isfilecache)28. $lostcaches=array();29. foreach($cachenamesas$cachename)30. /这里include缓存file31. if(!include_once(DISCUZ_ROOT./data/cache/cache_.$cachename.php)32. $lostcaches=$cachename;33. 34. 35. /如果已经有file,则不走$lostcaches=$cachename,$lostcaches没值,直接returnfile中的$data。36. if(!$lostcaches)37. return$data;38. 39. $cachenames=$lostcaches;40. unset($lostcaches);41. 42. $query=DB:query(SELECT/*!40001SQL_CACHE*/*FROM.DB:table(common_syscache).WHEREcnameIN(.implode(,$cachenames).);43. while($syscache=DB:fetch($query)44. $data$syscachecname=$syscachectype?unserialize($syscachedata):$syscachedata;45. /通过memcached存到内存里46. $allowmem&(memory(set,$syscachecname,$data$syscachecname);47. /创建file,数据存到file中48. if($isfilecache)49. $cachedata=$data.$syscachecname.=.var_export($data
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 键盘的使用课件
- 土建现场安全培训
- 小学语文《太阳》教学课件设计
- 少儿拼音班课件
- 钓鱼分类游戏课件
- 广东河北自考试题及答案
- 广东广东美学自考试题及答案
- 冷库考试题及答案大全
- 烤灯考试题及答案
- 抗震减灾考试题及答案
- 3DMine-矿业工程软件-帮助手册说明书
- 中小学五项管理-作业-睡眠-手机-读物-体质五项管理-课件-(26张课件)
- 2024年苏州历史文化名城建设集团有限公司招聘笔试冲刺题(带答案解析)
- 医院保洁中央运输服务项目管理制度
- 阿里巴巴与四十大盗的故事
- 《CT检查技术》课件-CT检查原理
- 新能源汽车功率电子基础 习题答案汇总(程夕明) 习题集1-6
- 《前列腺增生手术》课件
- 安全出口和疏散指示
- 肥料、农药采购服务方案(技术方案)
- 员工安全环保履职能力评估
评论
0/150
提交评论