免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3288 | 回复: 6
打印 上一主题 下一主题

[原创]Discuz! BBS的主动缓存和被动缓存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-16 23:25 |只看该作者 |倒序浏览
[文章作者:陈臻 本文版本:v1.1 最后修改:2009.3.16 转载请注明原文链接:http://www.54chen.com/c/505]

DZ的缓存同样分了主动缓存和被动缓存。从功能上来说,主动缓存一般用到管理员对全站的设置,等等需要手动更新的地方,这些地方的数据都有一个特点,那就是它们的更新可能性很小,平时不需要自动更新;DZ的被动缓存,一般分布在诸如帖子内容显示,用户信息更新这些地方,这些地方的更新基本上都是因为用户使用了某一特定的功能时所激发的。

在正常运行的DZ系统文件夹里面会有一个forumdata文件夹,这个是论坛记录和缓存文件的存放目录,一般这些文件都是自动生成的,在forumdata/cache/里面存储的都是一些DZ的基本设置和一些常使用的值,这些值一般在系统初始化的时候就保存在$_DCACHE全局变量中,在后面的操作中将可以简单地使用它们进行功能上的判断。

(1)主动缓存,也就是只在用户操作后台时,由DZ系统去删除原有缓存进行更新的缓存。它们普遍存在于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函数,此函数会判断缓存是否过期,如果不过期就执行函数中间读取缓存的操作,最后DZ直接巧妙地在函数中die出一段javaScript,结束访问。专研DZ代码的你可能会很疑惑,究竟是什么时候生成的缓存呢?include文件夹里有一个global.func.php,这个文件包括了整个DZ系统使用到的全局方法,其中有一个叫output的函数,在函数里判断了是否可以缓存当前的页面,并且使用ob_get_contents函数直接缓存页面。

提示:ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中,直到程序运行结束或者使用ob_flush()来结束。然后在服务器中缓冲区的内容才会发送到浏览器,由浏览器来解析显示。函数ob_end_clean 会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容。此时得用一个函数ob_get_contents()在ob_end_clean()前面来获得缓冲区的内容。这样的话, 能将在执行ob_end_clean()前把内容保存到一个变量中,然后在ob_end_clean()后面对这个变量做操作。

欢迎探讨

论坛徽章:
0
2 [报告]
发表于 2009-03-17 15:01 |只看该作者
nice,  请教一下,  象dz 这样的系统, 当他主动刷新的时候 他还是需要靠db 读数据的, 我希望能直接在换春里面实现 现实吗?

论坛徽章:
0
3 [报告]
发表于 2009-03-17 20:54 |只看该作者
“主动缓存”的说法有点勉强,无非就是生成配置文件。

楼上的,在这种情况下DB只是起到归档作用,放DB几乎没有任何影响。

论坛徽章:
0
4 [报告]
发表于 2009-03-18 09:06 |只看该作者
在这种情况下DB只是起到归档作用,放DB几乎没有任何影响。

也就是所有的内容必须在db里面? 否则不行

论坛徽章:
0
5 [报告]
发表于 2009-03-18 11:38 |只看该作者

回复 #5 秋水1伊人 的帖子

mj?

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
6 [报告]
发表于 2009-03-19 23:19 |只看该作者
原帖由 benjiam 于 2009-3-18 09:06 发表
在这种情况下DB只是起到归档作用,放DB几乎没有任何影响。

也就是所有的内容必须在db里面? 否则不行


非要死抠门啊?

放在哪里不是读啊!

论坛徽章:
0
7 [报告]
发表于 2009-03-23 11:19 |只看该作者
dz还可以啦,不过phpwind更强大一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP