织梦更新栏目缓存函数UpDateCatCache()分析
函数名:UpDateCatCache()
所在文件:/dede/config.php
原理分析:
从这个函数的名称“更新栏目缓存函数”就能知道,这个函数是关于更新栏目缓存的,如果学过关于缓存的知识都知道,为了减轻服务器负担,减少数据库操作,我们往往使用缓存技术,把经常要查询的内容在第一次从数据库取出来后,就把他写入的某一文件里面,这样等下次访问,就不用从数据库里取了,而是直接从这个缓存文件里面取出来,这样不仅可以减轻服务器负担,而且,可以增加安全性。
织梦系统也用了缓存技术,像我们在后台建立栏目后,织梦就使用这个“更新栏目缓存函数”来把建立好的栏目数据放入到缓存文件data/cache/inc_catalog_base.inc里面,若不存在这个文件,则程序用fopen这个函数建立之。其实,这个缓存函数应用的地方比较多,像函数GetSonIds()就使用了这个缓存函数,在别的地方应用的非常多。
这个函数的完整代码如下:
function UpDateCatCache() { global $dsql, $cfg_multi_site, $cache1, $cacheFile, $cuserLogin; $cache2 = DEDEDATA.'/cache/channelsonlist.inc'; $cache3 = DEDEDATA.'/cache/channeltoplist.inc'; $dsql->SetQuery("SELECT id,reid,channeltype,issend,typename FROM `#@__arctype`"); $dsql->Execute(); $fp1 = fopen($cache1,'w'); $phph = '?'; $fp1Header = "<{$phph}php\r\nglobal \$cfg_Cs;\r\n\$cfg_Cs=array();\r\n"; fwrite($fp1,$fp1Header); while($row=$dsql->GetObject()) { // 将typename缓存起来 $row->typename = base64_encode($row->typename); fwrite($fp1,"\$cfg_Cs[{$row->id}]=array({$row->reid},{$row->channeltype},{$row->issend},'{$row->typename}');\r\n"); } fwrite($fp1, "{$phph}>"); fclose($fp1); $cuserLogin->ReWriteAdminChannel(); @unlink($cache2); @unlink($cache3); }
要注意的是在这个函数上面,已经定义了cache1,即$cache1=DEDEDATA.'/cache/inc_catalog_base.inc'以及一个判断if(!file_exists($cache1))UpDateCatCache()
通过这个判断看一下$cache1是否存在,若不存在则通过函数UpDateCatCache()创建之。
源码分析:
1、函数一开始global了一些全局变量,并且,定义了二个变量cache2,cache3,这个就不用讲了。
2、设置一个sql查询语句:
SELECT id,reid,channeltype,issend,typename FROM `#@__arctype`
可以说是这本函数的最重要的一点,如果没有这个查询,那么,这个函数里面什么也没有,从这个查询我们就可以看出,缓存文件inc_catalog_base.inc存放的是栏目id、上级栏目id、模型id、是否发布值、以及栏目名。
执行$dsql->Execute()查询这个select语句。
3、打开inc_catalog_base.inc文件:通过fopen($cache1,'w')函数,打开这个文件,要注意:打开文件函数fopen里面有二个参数,一个是要打开的文件$cache1,一个是打开的模式w,模式w是指可写入方式打开,通过这种模式若文件不存在,则创建这个文件,若存在则打开之。
4、定义(写入)文件inc_catalog_base.inc里面的头部内容:
$phph = '?'; $fp1Header = "<{$phph}php\r\nglobal \$cfg_Cs;\r\n\$cfg_Cs=array();\r\n"; fwrite($fp1,$fp1Header);
通过上面三行代码,定义文件inc_catalog_base.inc里面前三行代码,代码如下所示。
<?php global $cfg_Cs; $cfg_Cs=array();
通过fwrite函数,执行后,文件inc_catalog_base.inc里面的前三行代码就已经写好了。接下来就是中间内容。
5、遍历查询出来的所有栏目信息:
通过while($row=$dsql->GetObject())进行遍历栏目内容。并且把遍历出来的栏目名称,通过函数base64_encode($row->typename)进行加密处理,所以,我们在缓存文件里面看到的是乱七八糟的栏目内容,其实,是通过这个函数加密了。
写入缓存文件代码:
fwrite($fp1,"\$cfg_Cs[{$row->id}]=array({$row->reid},{$row->channeltype},{$row->issend},'{$row->typename}');\r\n");
这行代码对应着文件inc_catalog_base.inc里面类似的:
$cfg_Cs[18]=array(0,1,1,'572R6aG15Z+656GA')
对这二行比对一下,不难发现,这二行代码是不是对应的?是的,正是通过遍历写入fwrite函数,我们才在缓存文件里面看到一条条栏目,这每一条就对应着一个栏目,其中,$cfg_Cs[18]数组键18指的是栏目id,后面的数组里面的值0代表上级栏目id,后面以次是模型id,是否发布,以及加密后的栏目名称。
6、关闭php结尾:fwrite($fp1,"{$phph}>"),继续写入内容?>这是结束符号。
7、关闭缓存文件:通过函数fclose($fp1)关闭文件,这是必须的,文件打开了就要关闭。
8、重写用户权限频道:$cuserLogin->ReWriteAdminChannel()这个函数不多解释,对于这个函数有详细的解释,因为,缓存文件已经改变,对于的用户对频道的权限可能改变了,所以,要重新缓存到权限文件里面。
9、删除文件:
unlink($cache2);
unlink($cache3);
在这个函数中这二个文件没有用过,这里删除,没有用为什么会写二个缓存文件呢?可能以后备用的,只是现在没有启用吧了。
当我们在后台建立栏目的时候,大家可以看一下这个缓存文件是不是我们每建立一个栏目就会在这个文件里增加一条内容。