织梦写缓存函数SetCache(参数)详细分析
为什么要缓存文件?要把这个说明白,一句话二句话是说不明白的,我们可以简单的这样理解,假如我们有很多书,这些书如果都放在书架子上,那你要使用某些书的时候,也许你用书签都标好了,但是,你也要找一下,这样麻烦,如果你把常用的书直接放在你的桌子上,例如词典类的,因为,这个要经常查词,这样你就不用起来查找了,直接拿过来用就行了,这样是不是提高了效率?节省了时间?是的,你的桌子就相当于一个缓存区。同样的道理我们有些内容是固定不变的,要经常用到的内容,这样我们使用时,就没有必要使用一次要查询一次了,这样不仅浪费时间,而且,还增加服务器负担,如果把要经常使用的内容拿出来,缓存到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里面设置好了,代码如下:
变量$cfg_memcache_enable的配置是在织梦后台:核心——>基本参数设置——>性能选项里面设置的,如下图所示。
$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,以友情连接为例子,内容如下图所示:
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;}