聊聊discuz缓存机制

Discuz!的缓存一样分了主动缓存和被动缓存。从功能上来讲,主动缓存通常用到管理员对全站的设置,等等须要手动更新的地方,这些地方的数据都有一个 特色,那就是它们的更新可能性很小,平时不须要自动更新;Discuz!的被动缓存,通常分布在诸如帖子内容显示,用户信息更新这些地方,这些地方的更新 基本上都是由于用户使用了某一特定的功能时所激发的。
 
在正常运行的Discuz!系统文件夹里面会有一个forumdata文件夹,这个是论坛记录和缓存文件的存放目录,通常这些文件都是自动生成的,在 forumdata/cache/里面存储的都是一些Discuz!的基本设置和一些常使用的值,这些值通常在系统初始化的时候就保存在$_DCACHE 全局变量中,在后面的操做中将能够简单地使用它们进行功能上的判断。
 

 
(1)主动缓存,也就是只在用户操做后台时,由Discuz!系统去删除原有缓存进行更新的缓存。它们广泛存在于forumdata/cache/目录 中,好比说/forumdata/cache/cache_settings.php保存了整个系统的核心设置,通常状况是不会更新的,只有后台修改了比 如站点名称等关键信息的时候才会去主动更新这个缓存文件。还有用于保存用户组和管理员组相关信息的两类缓存文件:
 
/forumdata/cache/usergroup_’.intval($groupid).’.php
 
/forumdata/cache/admingroup_’.intval($adminid).’.php
 
另外还有在index、forumdisplay、viewthread、post、blog、topicadmin、register、 archiver几个模块中的时候分别会使用的cache_’模块名‘.php的缓存。在include/common.inc.php中的流程能够看 到,这些相似的主动缓存都有一个特色:统一进行引用(include),最后进行失败检测,最后再对失败的缓存(好比说文件丢失或者是上次更新还没生成这 样的状况下)统一进行从新生成的操做,具体的生成方法见/include/cache.func.php中的updatecache函数。
 
(2)被动缓存,也就是缓存的生成并不是是由用户手动更新的,而是在系统里判断是否须要生成缓存,须要缓存多长时间,由系统自身来完成整个过程。很典型的代 表有帖子内容的缓存生成过程。帖子内容的缓存路径被cache_setting.php里定义为一个能够由用户修改的值,默认是在 forumdata/threadcaches下,由viewthread.php里的逻辑能够看到,当知足使用缓存条件的时候(通常状况是第一页的内 容),系统会执行viewthread_loadcache函数,此函数会判断缓存是否过时,若是不过时就执行函数中间读取缓存的操做,最后 Discuz!直接巧妙地在函数中die出一段javaScript,结束访问。专研Discuz!代码的你可能会很疑惑,到底是何时生成的缓存 呢?include文件夹里有一个global.func.php,这个文件包括了整个Discuz!系统使用到的全局方法,其中有一个叫output的 函数,在函数里判断了是否能够缓存当前的页面,而且使用ob_get_contents函数直接缓存页面。
 
提示:ob_start()在服务器打开一个缓冲区来保存全部的输出。因此在任什么时候候使用echo ,输出都将被加入缓冲区中,直到程序运行结束或者使用ob_flush()来结束。而后在服务器中缓冲区的内容才会发送到浏览器,由浏览器来解析显示。函 数ob_end_clean 会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容。此时得用一个函数ob_get_contents()在ob_end_clean()前面来得到缓 冲区的内容。这样的话, 能将在执行ob_end_clean()前把内容保存到一个变量中,而后在ob_end_clean()后面对这个变量作操做。