<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>五四陈科学院-坚信科学，分享技术 &#187; discuz</title>
	<atom:link href="http://www.54chen.com/tag/discuz/feed" rel="self" type="application/rss+xml" />
	<link>http://www.54chen.com</link>
	<description>PHP、JAVA、缓存、架构、经验、分享</description>
	<lastBuildDate>Fri, 10 Feb 2012 12:21:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>[原创]Discuz! BBS缓存整体方案</title>
		<link>http://www.54chen.com/php-tech/%e5%8e%9f%e5%88%9bdiscuz-bbs%e7%bc%93%e5%ad%98%e6%95%b4%e4%bd%93%e6%96%b9%e6%a1%88.html</link>
		<comments>http://www.54chen.com/php-tech/%e5%8e%9f%e5%88%9bdiscuz-bbs%e7%bc%93%e5%ad%98%e6%95%b4%e4%bd%93%e6%96%b9%e6%a1%88.html#comments</comments>
		<pubDate>Mon, 22 Jun 2009 00:25:44 +0000</pubDate>
		<dc:creator>cc0cc</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[架构研究]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[研究]]></category>
		<category><![CDATA[缓存]]></category>

		<guid isPermaLink="false">http://www.54chen.com/php-tech/%e5%8e%9f%e5%88%9bdiscuz-bbs%e7%bc%93%e5%ad%98%e6%95%b4%e4%bd%93%e6%96%b9%e6%a1%88.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>[ 文章作者：陈臻 本文版本：v1.0 最后修改：2009.6.22 转载请注明原文链接：http://www.54chen.com/c/611 ] DZ的缓存方案是经典之作，不论是系统的主动缓存还是帖子内容的被动缓存。在我前面的博文【[原创]Discuz! BBS的主动缓存和被动缓存】里所讲述的是DZ的缓存常用的一种方法，下面再说在DZ系统里如何决定一个内容是不是要缓存。 所有的数据全都缓存，不失为一个好办法。但是，在数据更新要求及时的环境下，例如帖子回复的内容要求立即显示等地，又不得不对其缓存进行更新。所以，基本上每一个成熟的系统，都不会去把所有的东西缓存起来。这时是不是让各位很困惑，缓存就是一把双刃剑，用好了系统效率事半功倍，用得不好，产品功能将受到严重影响。DZ就是一个缓存与不缓存选取得当的系统。 我们一起进入DZ的viewthread.php，也就是负责显示帖子内容的一个文件。代码一开始有这样一个判断： $page = max($page, 1); if($cachethreadlife &#38;&#38; $forum['threadcaches'] &#38;&#38; !$discuz_uid &#38;&#38; $page == 1 &#38;&#38; !$forum['special']) {        viewthread_loadcache(); } 这是什么意思呢？基本上就是在说，当一些系统的设置都满足的时候，只要是第一页就去执行viewthread_loadcache()，各位已经等不及看这个函数的意思了吧，且慢，先说说为什么选中了第一页。在经过大家长期的总结下，发现一个成熟论坛大多数时间会员都会停留在帖子的第一页，所以，DZ大胆地只将第一页进行缓存。 DZ真的是只将第一页进行缓存吗？答案是否定的，下面我们来看viewthread_loadcache()这个函数里的内容。 这个函数写在了viewthread.php的538行，看到这个函数的第一感觉，是专业。DZ的多年开发，已经将论坛的行为研究深深刻在了代码里。如下这段代码，这个函数里的$threadcachemark这个变量，被定义为与帖子的显示顺序、是否加精、此版最后回复天数、帖子浏览数、回复数、每页显示条数进行运算得到的一个值，如果这个值小于了版块的设置，这个帖子的内容才会生效。就也是说，DZ甚至还不是但凡第一页就缓存！ $threadcachemark = 100 - (               $forum['displayorder'] * 15 &#8230;<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">[ 文章作者：陈臻 本文版本：v1.0 最后修改：2009.6.22 转载请注明原文链接：<a href="http://www.54chen.com/c/611">http://www.54chen.com/c/611</a> ]</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><a href="http://www.54chen.com/c/505"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的缓存方案</span></span></a></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是经典之作，不论是系统的主动缓存还是帖子内容的被动缓存。在我前面的博文【<a href="http://www.54chen.com/c/505">[原创]Discuz! BBS的主动缓存和被动缓存</a>】里所讲述的是</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的缓存常用的一种方法，下面再说在</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">系统里如何决定一个内容是不是要缓存。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">所有的数据全都缓存，不失为一个好办法。但是，在数据更新要求及时的环境下，例如帖子回复的内容要求立即显示等地，又不得不对其缓存进行更新。所以，基本上每一个成熟的系统，都不会去把所有的东西缓存起来。这时是不是让各位很困惑，缓存就是一把双刃剑，用好了系统效率事半功倍，用得不好，产品功能将受到严重影响。</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">就是一个缓存与不缓存选取得当的系统。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">我们一起进入</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">viewthread.php</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，也就是负责显示帖子内容的一个文件。代码一开始有这样一个判断：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">$page = max($page, 1);</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">if($cachethreadlife &amp;&amp; $forum['threadcaches'] &amp;&amp; !$discuz_uid &amp;&amp; $page == 1 &amp;&amp; !$forum['special']) {</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="mso-tab-count: 1;">       </span>viewthread_loadcache();</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">}</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这是什么意思呢？基本上就是在说，当一些系统的设置都满足的时候，只要是第一页就去执行</span><span lang="EN-US"><span style="font-family: Times New Roman;">viewthread_<a href="http://www.54chen.com/c/516">load</a>cache()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，各位已经等不及看这个函数的意思了吧，且慢，先说说为什么选中了第一页。在经过大家长期的总结下，发现一个成熟论坛大多数时间会员都会停留在帖子的第一页，所以，</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">大胆地只将第一页进行缓存。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">真的是只将第一页进行缓存吗？答案是否定的，下面我们来看</span><span lang="EN-US"><span style="font-family: Times New Roman;">viewthread_loadcache()</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这个函数里的内容。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这个函数写在了</span><span lang="EN-US"><span style="font-family: Times New Roman;">viewthread.php</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的</span><span lang="EN-US"><span style="font-family: Times New Roman;">538</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">行，看到这个函数的第一感觉，是专业。</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的多年开发，已经将论坛的行为研究深深刻在了代码里。如下这段代码，这个函数里的</span><span lang="EN-US"><span style="font-family: Times New Roman;">$threadcachemark</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这个变量，被定义为与帖子的显示顺序、是否加精、此版最后回复天数、帖子浏览数、回复数、每页显示条数进行运算得到的一个值，如果这个值小于了版块的设置，这个帖子的内容才会生效。就也是说，</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">甚至还不是但凡第一页就缓存！</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">$threadcachemark = 100 - (</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="mso-tab-count: 2;">              </span>$forum['displayorder'] * 15 +</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="mso-tab-count: 2;">              </span>$forum['digest'] * 10 +</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="mso-tab-count: 2;">              </span>min($forum['views'] / max($forum['livedays'], 10) * 2, 50) +</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="mso-tab-count: 2;">              </span>max(-10, (15 - $forum['lastpostdays'])) +</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="font-size: small;"><span style="mso-tab-count: 2;">              </span>min($forum['replies'] / $_DCACHE['settings']['postperpage'] * 1.5, 15));</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这个经典的公式从何而来？由笔者有幸参加的一次</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的培训得知，这个公式是多年来长期的积累，不断的尝试，才总结所得。至于更多的细节，大概只有</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的总设计师才能得知。不过我们也可以从代码里得到一些提示，帖子的属性是可以作为是否缓存的权值的，而这个权值，直接决定了缓存与否。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">这样的选取在</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里到处可见，在存在分页的地方，只需要记住，前两页或者前一页，以及最后两页或最后一页，永远比中间的更值得缓存。如果读者的系统需要一个缓存方案，建议全局统计一下所有的用户关注的点，学习</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的<a href="http://www.54chen.com/c/531">思想</a>，将这些关键的点数值化，就一定也能得出一个合适的公式。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">一个简约的缓存，每个细节的方案，筑成了</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">整体的坚实。</span></span></p>
<blockquote><p><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">提示：平时在设计系统的时候，也许并不能考虑到这么细，如果不是受到磁盘空间的限制，您并不需要担心按照什么方案来缓存，用一刀切的方案也不错，也就是把大部分看上去很常用的数据都缓存了，但你需要更多考虑去对比是否需要更新缓存了，比如用最后回复的时间去对比，很多开源系统就都是这样干的。</span></p></blockquote>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/php-tech/%e5%8e%9f%e5%88%9bdiscuz-bbs%e7%bc%93%e5%ad%98%e6%95%b4%e4%bd%93%e6%96%b9%e6%a1%88.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[原创]Discuz! BBS的主动缓存和被动缓存</title>
		<link>http://www.54chen.com/php-tech/discuz-bbs-active-and-passive-cache.html</link>
		<comments>http://www.54chen.com/php-tech/discuz-bbs-active-and-passive-cache.html#comments</comments>
		<pubDate>Mon, 16 Mar 2009 14:50:07 +0000</pubDate>
		<dc:creator>cc0cc</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[架构研究]]></category>
		<category><![CDATA[discuz]]></category>
		<category><![CDATA[缓存]]></category>

		<guid isPermaLink="false">http://www.54chen.com/php-tech/discuz-bbs-active-and-passive-cache.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>[文章作者：陈臻 本文版本：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()后面对这个变量做操作。 关于哥学社： 哥学社是一个自由博客组织，以提高原创技术博客质量，为成员博客增加更有效评论，由来自腾讯、百度、盛大、人人网、新浪、奇虎、TOM等各大企业的哥们共同起草发起。 关于五四陈： 54chen(陈臻)，人人网海量存储NuClear核心开发人员，业余时间混迹于各技术组织且乐此不疲。目前关注实施PHP培训。对flex等前端技术有一点研究。 个人技术站点:http://www.54chen.com/ 。可以通过电子邮件 czhttp@gmail.com 联系到他。<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p>[文章作者：陈臻 本文版本：v1.1 最后修改：2009.3.16 转载请注明原文链接：<a href="http://www.54chen.com/c/505">http://www.54chen.com/c/505</a>]</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的缓存同样分了主动缓存和被动缓存。从功能上来说，主动缓存一般用到管理员对全站的设置，等等需要手动更新的地方，这些地方的数据都有一个特点，那就是它们的更新可能性很小，平时不需要自动更新；</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的被动缓存，一般分布在诸如帖子内容显示，用户信息更新这些地方，这些地方的更新基本上都是因为用户使用了某一特定的功能时所激发的。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在正常运行的</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">系统文件夹里面会有一个</span><span lang="EN-US"><span style="font-family: Times New Roman;">forum<a href="http://www.54chen.com/c/399">data</a></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">文件夹，这个是论坛记录和缓存文件的存放目录，一般这些文件都是自动生成的，在</span><span lang="EN-US"><span style="font-family: Times New Roman;">forumdata/cache/</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里面存储的都是一些</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的基本设置和一些常使用的值，这些值一般在系统初始化的时候就保存在</span><span lang="EN-US"><span style="font-family: Times New Roman;">$_DCACHE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">全局变量中，在后面的操作中将可以简单地使用它们进行功能上的判断。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">（</span><span lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）主动缓存，也就是只在用户操作后台时，由</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">系统去删除原有缓存进行更新的缓存。它们普遍存在于</span><span lang="EN-US"><span style="font-family: Times New Roman;">forumdata/cache/</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">目录中，比如说</span><span lang="EN-US"><span style="font-family: Times New Roman;">/forumdata/cache/cache_settings.php</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">保存了整个系统的核心设置，一般情况是不会更新的，只有后台修改了比如站点名称等关键信息的时候才会去主动更新这个缓存文件。还有用于保存用户组和管理员组相关信息的两类缓存文件：</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">/forumdata/cache/usergroup_'.intval($groupid).'.php</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">/forumdata/cache/admingroup_'.intval($adminid).'.php</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">另外还有在</span><span lang="EN-US"><span style="font-family: Times New Roman;">index</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">forumdisplay</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">viewthread</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">post</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">blog</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">topicadmin</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">register</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、</span><span lang="EN-US"><span style="font-family: Times New Roman;">archiver</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">几个模块中的时候分别会使用的</span><span lang="EN-US"><span style="font-family: Times New Roman;">cache_'</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">模块名</span><span lang="EN-US"><span style="font-family: Times New Roman;">'.php</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的缓存。在</span><span lang="EN-US"><span style="font-family: Times New Roman;">include/common.inc.php</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中的流程可以看到，这些类似的主动缓存都有一个特点：统一进行引用（</span><span lang="EN-US"><span style="font-family: Times New Roman;">include</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">），最后进行失败检测，最后再对失败的缓存（比如说文件丢失或者是上次更新还没生成这样的情况下）统一进行重新生成的操作，具体的生成方法见</span><span lang="EN-US"><span style="font-family: Times New Roman;">/include/cache.func.php</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中的</span><span lang="EN-US"><span style="font-family: Times New Roman;">updatecache</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">函数。</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">（</span><span lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）被动缓存，也就是缓存的生成并非是由用户手动更新的，而是在系统里判断是否需要生成缓存，需要缓存多长时间，由系统自身来完成整个过程。很典型的代表有帖子内容的缓存生成过程。帖子内容的缓存路径被</span><span lang="EN-US"><span style="font-family: Times New Roman;">cache_setting.<a href="http://www.54chen.com/c/157">php</a></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里定义为一个可以由用户修改的值，默认是在</span><span lang="EN-US"><span style="font-family: Times New Roman;">forumdata/threadcaches</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">下，由</span><span lang="EN-US"><span style="font-family: Times New Roman;">viewthread.php</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里的逻辑可以看到，当满足使用缓存条件的时候（一般情况是第一页的内容），系统会执行</span><span lang="EN-US"><span style="font-family: Times New Roman;">viewthread_loadcache</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">函数，此函数会判断缓存是否过期，如果不过期就执行函数中间读取缓存的操作，最后</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">直接巧妙地在函数中</span><span lang="EN-US"><span style="font-family: Times New Roman;">die</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">出一段</span><span lang="EN-US"><span style="font-family: Times New Roman;">javaScript</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，结束访问。专研</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">代码的你可能会很疑惑，究竟是什么时候生成的缓存呢？</span><span lang="EN-US"><span style="font-family: Times New Roman;">include</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">文件夹里有一个</span><span lang="EN-US"><span style="font-family: Times New Roman;">global.func.php</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，这个文件包括了整个</span><span lang="EN-US"><span style="font-family: Times New Roman;">DZ</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">系统使用到的全局方法，其中有一个叫</span><span lang="EN-US"><span style="font-family: Times New Roman;">output</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的函数，在函数里判断了是否可以缓存当前的页面，并且使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">ob_get_contents</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">函数直接缓存页面。</span></span></p>
<p class="MsoList" style="MARGIN: 0cm 0cm 0pt 63.8pt"><span style="font-size: small;"><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">提示：</span><span lang="EN-US"><span style="font-family: Times New Roman;">ob_start()</span></span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">echo </span></span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">，输出都将被加入缓冲区中，直到程序运行结束或者使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">ob_flush()</span></span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">来结束。然后在服务器中缓冲区的内容才会发送到浏览器，由浏览器来解析显示。函数</span><span lang="EN-US"><span style="font-family: Times New Roman;">ob_end_clean </span></span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">会清除缓冲区的内容，并将缓冲区关闭，但不会输出内容。此时得用一个函数</span><span lang="EN-US"><span style="font-family: Times New Roman;">ob_get_contents()</span></span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">在</span><span lang="EN-US"><span style="font-family: Times New Roman;">ob_end_clean()</span></span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">前面来获得缓冲区的内容。这样的话，</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">能将在执行</span><span lang="EN-US"><span style="font-family: Times New Roman;">ob_end_clean()</span></span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">前把内容保存到一个变量中，然后在</span><span lang="EN-US"><span style="font-family: Times New Roman;">ob_end_clean()</span></span><span style="font-family: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman';">后面对这个变量做操作。</span></span></p>
<p>关于哥学社：<br />
<a title="哥学社" href="http://www.54chen.com/blog-brother" target="_self">哥学社</a>是一个自由博客组织，以提高原创技术博客质量，为成员博客增加更有效评论，由来自腾讯、百度、盛大、人人网、新浪、奇虎、TOM等各大企业的哥们共同起草发起。</p>
<p>关于五四陈：<br />
54chen(陈臻)，人人网海量存储NuClear核心开发人员，业余时间混迹于各技术组织且乐此不疲。目前关注实施PHP培训。对flex等前端技术有一点研究。<br />
个人技术站点:<a href="http://www.54chen.com/">http://www.54chen.com/</a> 。可以通过电子邮件 czhttp@gmail.com 联系到他。</p>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/php-tech/discuz-bbs-active-and-passive-cache.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

