织梦写缓存函数SetCache(参数)详细分析

admin2020-01-271430

为什么要缓存文件?要把这个说明白,一句话二句话是说不明白的,我们可以简单的这样理解,假如我们有很多书,这些书如果都放在书架子上,那你要使用某些书的时候,也许你用书签都标好了,但是,你也要找一下,这样麻烦,如果你把常用的书直接放在你的桌子上,例如词典类的,因为,这个要经常查词,这样你就不用起来查找了,直接拿过来用就行了,这样是不是提高了效率?节省了时间?是的,你的桌子就相当于一个缓存区。同样的道理我们有些内容是固定不变的,要经常用到的内容,这样我们使用时,就没有必要使用一次要查询一次了,这样不仅浪费时间,而且,还增加服务器负担,如果把要经常使用的内容拿出来,缓存到data/cache里面,这样使用时,就直接到这里面找,这样比查询数据库速度快,而且,安全。

当然,我们一般不把重要的像密码什么的,放在这里。这就是为什么系统中需要缓存的重要原因,这个函数就是把数据缓存起来。

函数名:SetCache($prefix, $key, $value, $timeout = 3600, $is_memcache = TRUE)

所在文件:include/helpers/cache.helper.php

功能:把要需要写缓存的内容,写到文件里面缓存到data/cache文件夹里面,以备调用。

参数:

  string  $prefix  前缀
  string  $key  键
  string  $value  值
  string  $timeout  缓存时间
  @return    int

如果这样看参数的话,一般不好理解这些参数到底是做什么的,如果一个一个的解释也不好理解,只有把这个函数的代码分析完后,这些自然就明白是什么了。

代码分析开始:

1.声明全局变量$cache_helper_config,其实,这是一个已经定义好了的三维数组,缓存配置信息就在这里面,这个在文件common.inc.php里面设置好了,代码如下:

100656dlmcm5ubjcrgjjue.jpg

变量$cfg_memcache_enable的配置是在织梦后台:核心——>基本参数设置——>性能选项里面设置的,如下图所示。

100656dlmcm5ubjcrgjjue.jpg

$GLOBALS["cfg_memcache_mc_defa"]指的是:默认memcache缓存服务器地址

$GLOBALS["cfg_memcache_mc_oth"]指的是:附加memcache缓存服务器地址

2.md5加密第二个参数键$key :

$key = md5 ( $key )

3. 启用mc缓存,这个需要你配置缓存服务器,织梦默认情况是不使用mc缓存的,除非你的站非常大,一般的网站我们不需要这个:如果缓存文件不空且$cache_helper_config['memcache']['is_mc_enable']的值为y,也就是$GLOBALS["cfg_memcache_enable"]值为y,即,后台的配置为y,并且这个函数里面的参数$is_memcache 横等于true时,表示启用mc缓存,如果启用,那就处理这个缓存,我们看一下织梦是如何处理的。

设置mc缓存路径$mc_path: 这个是通过$cache_helper_config['memcache'] ['mc'] [substr ( $key, 0, 1 )] 的值来判断的,这一行三元运算比较好理解。

处理$mc_path:通过函数parse_url($mc_path),关于这个函数它解析url后返回一个关联数组,举个例子:例如

$url = 'http://www.dedebase.com/forum.php?gid=39';

那么,执行函数parse_url($url) 后,得到的关联数组为:

Array ( [scheme] => http [host] => www.dedebase.com [path] => /forum.php [query] => gid=39 )

得到的路径是:/forum.php 是我们下面用到的,但是,如果上面的url变成

$url = 'http://www.dedebase.com/abc/de/'

得到的数组就是:

Array ( [scheme] => http [host] => www.dedebase.com [path] => /abc/de/ )

路径就是:/abc/de/

组装$key:

$key = ltrim ( $mc_path ['path'], '/' ) . '_' . $prefix . '_' . $key;

里面的函数就是移除有可能是以'/'为后缀的路径,这个$key=/abc/de_$prefix_$key了。

若 $GLOBALS ['mc_' . $mc_path ['host']]为空,一般情况下这个是空的,在配置缓存信息时,这个没有设置过,所以,如果我们安装织梦系统后,这个就是空。

接下来就实例化缓存:

$GLOBALS ['mc_' . $mc_path ['host']] = new Memcache ( );

连接mc服务器:

$GLOBALS ['mc_' . $mc_path ['host']]->connect ( $mc_path ['host'], $mc_path ['port'] )

对参数进行处理后,返回结果:

$result = $GLOBALS ['mc_' . $mc_path ['host']]->set ( $key, $value, MEMCACHE_COMPRESSED, $timeout );
            return $result;

织梦默认情况下是不启用mc缓存的,所以,上面的一般不使用,接着看代码。

4. 设置$key 也就是缓存文件路径:取md5($key)后的前二位,组成一个目录,总共取三个,

$key = substr ( $key, 0, 2 ) . '/' . substr ( $key, 2, 2 ) . '/' . substr ( $key, 4, 2 ) . '/' . $key;

这个好理解,不如我们拿个例子来解释,如下图所示flink 缓存目录:

5.设置存放到缓存文件里面的内容,代码为:

       $tmp ['data'] = $value;
        $tmp ['timeout'] = $timeout != 0 ? time () + ( int ) $timeout : 0;

第一行是是函数里面的第三个参数,第二行是里面的$timeout 是第四个参数,即$timeout = 3600,判断这个是否为0,若不为0表示当前时间加上参数里面的这个时间,否则为0。

然后,组装缓存文件内容:在文件头部加上<?php exit('dedecms');?> 回车换行,串行化数组$tmp 。

这时候得到的缓存文件内容$cache_data,以友情连接为例子,内容如下图所示:

100656dlmcm5ubjcrgjjue.jpg

6.把内容写入缓存文件data/cache/$prefix/$key.php 里面,并返回这个文件内容的字节数,这个返回值是一个整数。其中,把内容写入缓存文件是通过织梦系统已经封装的函数PutFiel(文件名,要写入的内容) ,这个返回返回的是文件内容字节数。

实验测试:

  $str="织梦基地:www.dedebase.com";
  echo SetCache('dedebase',99,$str);

这样我们得到的值为:107

我们看一下缓存文件路径及缓存文件名:

缓存内容为:

<?php exit('dedecms');?>
a:2:{s:4:"data";s:29:"织梦基地:www.dedebase.com";s:7:"timeout";i:1438052238;}


网友评论