Discuz的模板缓存机制分析

一直都在使用discuz与supesite的缓存机制,大致机制清楚,但是没有系统的分析过 ,今天有空
分析了下代码。
主要是包含存放模板缓存文件的 forumdata文件夹 include下的template.func.php、 global.func.php文件,主要是用到 这2个文件中的一些函数。再有就是存放模板文件的templates文件夹。
我首先 新建了一个index.php文件。
PHP代码
  1. <?php
  2. header("Content-type=text/html; charset=utf- 8");
  3. require_once './common.inc.php';
  4. $timestamp = time();
  5. $tplrefresh = 1; //控制当模板改变时立刻更新缓存
  6. $header = "This is header";
  7. $main = "This is main";
  8. $footer = "This is footer";
  9. include template("index");
  10. ?>
顺 便把common.inc.php的文件也粘出来
PHP代码
  1. <?php
  2. define('IN_TRINDO',true);
  3. define('TRINDO_ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR);
  4. define('TEMPLATEID', '1');
  5. define('TPLDIR','./templates/default');
  6. require_once './include/global.func.php';
  7. ? >
看index.php中的include template("index"),主要就是调用template函数。那我们接着看include下的 global.func.php里的template函数(下面的代码每个empty前多出了一个empty,编辑器的 问题)
PHP代码
  1. <?php
  2. function strexists($haystack, $needle) {
  3. return !(strpos($haystack, $needle) === FALSE);
  4. }
  5. function checktplrefresh($maintpl, $subtpl, $timecompare, $templateid, $tpldir) {
  6. global $tplrefresh;
  7. echo "缓存文件 最后修改时间:".date ("Y-m- d H:i:s",$timecompare)."<br>";
  8. echo "模板文件 最后修改时间:".date ("Y-m- d H:i:s",filemtime($subtpl))."<br>";
  9. echo "现在时间 :".date("Y-m-d H:i:s",time())."<br><br>";
  10. if(emptyempty($timecompare) || $tplrefresh == 1 || ($tplrefresh > 1 && ! ($GLOBALS['timestamp'] % $tplrefresh))) {
  11. if(emptyempty($timecompare) || @filemtime($subtpl) > $timecompare) {
  12. &nbs p; require_once TRINDO_ROOT.'./include/template.func.php';
  13. & nbsp; parse_template($maintpl, $templateid, $tpldir);
  14. &nbs p; return TRUE;
  15. }
  16. }
  17. return FALSE;
  18. }
  19. function template($file, $templateid = 0, $tpldir = '') {
  20. global $inajax;
  21. $file .= $inajax && ($file == 'header' || $file == 'footer') ? '_ajax' : '';
  22. $tpldir = $tpldir ? $tpldir : TPLDIR;
  23. $templateid = $templateid ? $templateid : TEMPLATEID;
  24. $tplfile = TRINDO_ROOT.'./'.$tpldir.'/'.$file.'.htm';
  25. $objfile = TRINDO_ROOT.'./forumdata/templates/'.$templateid.'_'.$file.'.tpl.php';
  26. if($templateid != 1 && ! file_exists($tplfile)) {
  27. $tplfile = TRINDO_ROOT.'./templates/default/'.$file.'.htm';
  28. }
  29. @checktplrefresh($tplfile, $tplfile, filemtime($objfile), $templateid, $tpldir);
  30. return $objfile;
  31. }
  32. ? >
这里$tplfile为模板文件, $objfile为模板缓存文件,$tpldir为模板存放文件夹,这里默认的是/templates/default 。主要来看checktplrefresh这个函数,我在这个函数里标记了几个文件时间,以便更容易 的分析。$tplrefresh是一旦模板有改动是否立刻重新生成缓存的控制开关,我这里设为1 ,开启了。$timecompare为模板缓存的最后修改的时间,如果第一次运行没有生产缓存的 话,其为空,那我们就得引用template.func.php文件里的parse_template函数了,这个函 数的主要用途就是利用正则将模板文件里的标签替换成php语法,然后写入到模板缓存文件 中,成功后template就将一个已经生产的模板缓存文件返回,这个再include的话就直接可 以输出了。
如果第一次生成缓存成功的话,下次就不会再执行parse_template 函数去重新编译模板了,直接就将已存在的缓存文件返回,这样就提高了效率。
一旦模板文件有改动,则@filemtime($subtpl) > $timecompare成立,系 统将会重新执行parse_template函数去编译模板,修改的效果就立刻生效了。

你可能感兴趣的:(职场,discuz,include,文件夹,休闲)