织梦解析模板并写缓存文件函数WriteCache

admin2023-01-181071

函数名:WriteCache($ctype='all')

参数:string$ctype缓存类型

功能:把模板引擎编译好的内容缓存到/data/tplcache/里面

所在文件:/include/dedetemplate.class.php

以前对模板引擎的缓存内容理解有误,直接做了一个后台二次开发的实例后,才把这个突然发现自己在载入模板时,理解有错误,当然,感觉这个写入缓存文件函数比较简单,也确实比较简单,但是,简单的综合起来后,就有难度了。本教程对这个函数分析一下,在后面显示数据函数display()就使用了这个函数,从这里显示数据函数就可以知道,当把模板里面的标签全部替换成php代码后,才调用这个写入缓存文件的。

在这个函数里面最核心的就是:把编译好的模板文件写入到缓存文件里面,就这一点内容,其它都是为这个作准备,用到的php函数也就是打开文件fopen(),写入内容fwrite(),关闭打开的文件fclose()。

代码分析开始:

要把内容写入缓存文件$this->cacheFile,只有下面任何一条成立就要写入缓存文件:

1.缓存文件$this->cacheFile不存在的情况。除非我们在后台设置不缓存文件,否则,只要文件不存在当然,就要写入缓存文件了。

2.若$this->isCache==FALSE,也就是不开启缓存文件。

3.模板文件的修改时间比对应的缓存文件时间要大,这时就要写入缓存。

只要上面这三条中的任何一条,成立,那么,我们就要写入缓存文件,然后,保存到/data/tplcache/文件夹里面。

函数里面这个大条件成立,则判断里面的一个一个的小条件。

条件判断:

if(!$this->isParse)
{
$this->ParseTemplate();
}

因为,默认的情况下$this->isParse等于false,只有当解析模板时,这个值才变为true,所以,这里判断一下,如果这个值为false说明还没有解析模板,既然,模板都没有解析,那么,就不可能去缓存文件,因为,模板里面的标签还没有被编译成php代码。所以,若$this->isParse为false,则解析模板。

                $fp = fopen($this->cacheFile,'w') or dir("Write Cache File Error! ");
                flock($fp,3);
                $result = trim($this->GetResult());
                $errmsg = '';
                if (!$this->CheckDisabledFunctions($result, $errmsg))
                {
                    fclose($fp);
                    @unlink($this->cacheFile);
                    die($errmsg);
                }
                fwrite($fp,$result);
                fclose($fp);

因为,默认的情况下$this->isParse等于false,只有当解析模板时,这个值才变为true,所以,这里判断一下,如果这个值为false说明还没有解析模板,既然,模板都没有解析,那么,就不可能去缓存文件,因为,模板里面的标签还没有被编译成php代码。所以,若$this->isParse为false,则解析模板。

<?php
if(!isset($GLOBALS['_vars'])) $GLOBALS['_vars'] = array();
$fields = array();
?>

因为,我们模板里面用到的标记经常global,field,特别是标签{dede:datalist}{/dede:datalist}中间全用的是fields,所以,这里定义了这二个为数组。

作用函数CheckDisabledFunctions():检查是否存在禁止的函数,这些被禁止的函数,可以在后台[系统基本设置]中的“其他选项”中进行设置,如下图所示。这段代码是:

360截图187201204892107.jpg

若模板中有禁用函数,则删除这个缓存文件,关闭文件显示错误信息,并结束程序。否则,写入缓存文件,然后,关闭打开的文件。

若在模板中使用配置标签{dede:config name=""value=""/},那么,把这个配置文件写入缓存配置文件里面,缓存起来。

要判断有没有模板中有没有使用配置标签,只需要判断数组$this->tpCfgs这个值是否为0,因为,配置标签编译内容都存在在这个数组里面。若有值,则说明有这个配置标签,那么,就要在data/tplcache/里面建立这个缓存文件,并写入类似如下代码内容:

<?php
$this->tpCfgs['www.dedebase.com']="织梦基地";
?>

函数结束,其实,这个函数就是做了二件事,一是把一般的标签的缓存文件写入到data/tplcache/里面;二是把配置标签写入缓存目录里面。

网友评论