ThinkPHP框架总结之缓存:
在实际项目中,合理使用缓存技术可以很好地提高性能。TP提供了多种缓存机制,包括数据缓存、查询缓存、静态缓存及快速缓存,同时支持Memcache、Redis、Xcache、Apc、Db、Shmop、Sqlite及Eaccelerator等的动态缓存。
对于动态缓存的几种方式的区别和特点,会在专题篇中进行汇总介绍。另外,我们知道ThinkPHP封装使用S方法来对缓存进行存取操作,这样比较方便实用,适用于各种缓存的存取操作,这里以默认的文件缓存方式为例进行介绍。
一、数据缓存
在系统的惯例配置文件convention.php中已经默认打开并预定义了数据缓存,如下(具体查看注释):
/* 数据缓存设置 */
'DATA_CACHE_TIME' => 0, // 数据缓存有效期 0表示永久缓存
'DATA_CACHE_COMPRESS' =>false,// 数据缓存是否压缩缓存
'DATA_CACHE_CHECK' => false, //数据缓存是否校验缓存
'DATA_CACHE_PREFIX' => '', // 缓存前缀
'DATA_CACHE_TYPE' => '', // 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator
'DATA_CACHE_PATH' => TEMP_PATH,//缓存路径设置 (仅对File方式缓存有效)
'DATA_CACHE_KEY' => '_think_', // 缓存文件KEY (仅对File方式缓存有效)
'DATA_CACHE_SUBDIR' => false, //使用子目录缓存 (自动根据缓存标识的哈希创建子目录)
'DATA_PATH_LEVEL' => 1, // 子目录缓存级别
那么,下面来介绍下如何使用S方法去初始化缓存参数、设置缓存、读取缓存以及删除缓存,具体如下:
1、缓存初始化
// 缓存初始化默认为File(未设定的参数以预定义为准,缓存单位为秒)
S(array(
'type'=>'File',
'prefix'=>'_cache_file',
'expire'=>30
));
2、设置缓存
// 缓存设置内容为‘Hello Cache!’时长为默认60秒
S('cache_key','Hello Cache!',60);
3、读取缓存
// 缓存读取
$cacheValue = S('cache_key');
4、删除缓存
// 删除缓存(删除缓存文件)
$cacheValue= S('cache_key',null);
echo '删除缓存后:'.$cacheValue;
注意:
文件缓存方式,建议添加文件key,以混淆文件名字,如下:
'DATA_CACHE_KEY'=> '_think_', // 缓存文件KEY (仅对File方式缓存有效)
缓存的文件存放路径,可以设置,如下:
'DATA_CACHE_PATH' => TEMP_PATH,//缓存路径设置 (仅对File方式缓存有效),该目录为当前项目的Runtime下的Temp目录下,文件名规则:prefix+加密串。
全局缓存文件建议添加前缀prefix,如下:
S(array('type'=>'File','prefix'=>'_cache_file','expire'=>30));
二、查询缓存
查询缓存是针对数据查询的一种优化,对于及时性要求不高的数据查询,我们可以使用该功能来提高性能,该功能支持所有的数据库及所有的数据缓存方式,并且不需要自己使用缓存方法缓存和读取缓存数据。
在使用查询缓存时,只需要调用Model类的cache方法设定缓存的方式、时长及获取缓存操作,具体如下:
1、缓存及初始化
无键值时:
$wheres = array();
$wheres['account'] = $account;
$User= M('UserInfo');
// 无键值时缓存方式为file缓存时长为60秒不能指定清除这个缓存文件也不能获得缓存内容
$data= $User->where($wheres)->cache(true,60,'file')->find();
有键值时:
$wheres = array();
$wheres['account'] = $account;
$User= M('UserInfo');
// 有键值时缓存方式为file缓存时长为60秒可以指定清除这个缓存文件也可以获得缓存内容
$data = $User->where($wheres)->cache('_cache_key_',60,'file')->find();
2、缓存读取
// 缓存读取
$msg = S('_cache_key_');
3、缓存删除
// 缓存清空
S('_cache_key_',null);
三、静态缓存
静态缓存是TP针对前端html频繁请求做出的性能优化处理,只支持Get方式下的请求处理,支持不同的存储类型,缓存文件存放在HTML_PATH目录下,并且只有定义了静态规则的请求才能进行缓存。
下面从静态缓存规则定义、静态地址、静态规则、附加规则几方面说明,如下:
1、静态缓存规则定义
// 静态缓存配置参数
'HTML_CACHE_ON' => true, // 开启静态缓存
'HTML_CACHE_TIME' => 60, //全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX' => '.shtml', // 设置静态缓存文件后缀
'HTML_CACHE_RULES' => array( //定义静态缓存规则
// 定义格式1数组方式
'静态地址' => array('静态规则','有效期','附加规则'),
// 定义格式2字符串方式
'静态地址' => '静态规则'
)
一般情况下,我们使用定义格式1,即数组方式,因为方便为单一的静态规则设置有效期,所以这里也以数组方式为例说明,在介绍完其余内容后,会在最后面给出完整的静态缓存配置预定义和例子。
2、静态地址
静态地址格式有多种定义,具体如下:
1)定义全局的操作静态规则,例如定义所有的read操作的静态规则为:
'read'=>array('{id}',60)
其中,{id}表示取$_GET['id']为静态缓存文件名,第二个参数表示缓存60秒。
2)定义全局的控制器静态规则,例如定义所有的User控制器的静态规则为:
'user:'=>array('User/{:action}_{id}','600')
其中,{:action}表示当前的操作名称
3)定义某个控制器的操作的静态规则,例如,我们需要定义Blog控制器的read操作进行静态缓存
'blog:read'=>array('{id}',0)
4)定义全局的静态缓存规则,这个属于特殊情况下的使用,任何模块的操作都适用,例如,
'*'=>array('{$_SERVER.REQUEST_URI|md5}')
表示根据当前请求的url进行缓存
3、静态规则
静态规则是用来定义缓存文件名字的,确保生成的文件不冲突的。其定义也含有多种方式,具体如下:
1)使用系统变量
包括 _GET、_REQUEST、_SERVER、_SESSION、_COOKIE格式:
{$_×××|function}
例如:
{$_GET.name}
{$_SERVER.REQUEST_URI|md5}
2)使用框架特定的变量
{:module}、{:controller}和{:action}分别表示当前模块名、控制器名和操作名。
例如:
{:module}/{:controller}_{:action}
3)使用_GET变量
{var|function}也就是说{id}其实等效于{$_GET.id}
4)使用函数
{|function} 例如:
{|time}
5)支持混合定义
例如,我们可以定义一个静态规则为:
'{id},{name|md5}'
在{}之外的字符作为字符串对待,如果包含有"/",会自动创建目录。
例如,定义下面的静态规则:
{:module}/{:action}_{id}
则会在静态目录下面创建模块名称的子目录,然后写入操作名_id.shtml 文件。
4、附加规则
一般情况下,附加规则主要是对静态规则函数运算的,例如:
'read'=>array('Think{id},{name}','60','md5')
解释后的静态规则是md5('Think'.$_GET['id']. ', '.$_GET['name']);
最后,给出完整比较常用的静态规则定义及使用,具体如下:
缓存规则定义:
// 静态缓存配置参数
'HTML_CACHE_ON' => true, // 开启静态缓存
'HTML_CACHE_TIME' => 60, //全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX' => '.shtml', // 设置静态缓存文件后缀
'HTML_CACHE_RULES' => array( //定义静态缓存规则
// 静态地址:控制器cache下的cacheforstatic的缓存规则
// 静态规则:{:module}/{:action}_{$_GET.name}
// 有效时间:30秒
// 附加规则:附加后的静态规则md5('{:module}/{:action}_{_|time}')
'cache:cacheforstatic' => array('{:module}/{:action}_{_|time}',30,'md5'),
前端页面:
<!DOCTYPE html>
<html>
<head>
<metacharset="UTF-8">
<scriptsrc="__PUBLIC__/htmls/js/jquery-1.8.3.min.js"></script>
<linkrel="stylesheet"href="__PUBLIC__/htmls/css/company/company.css"/>
</head>
<bodystyle="background-color:#9999;">
<div>Hello static cache!</div>
</body>
</html>
后台接口:
// 静态缓存
public function cacheForStatic() {
$this->display('static');
}
缓存结果:
注意:
缓存结果的位置默认为HTML_PATH,也就是当前应用目录下,会自动新建Html目录,缓存文件存放其中,当然,这个默认位置是可以修改的,另外,我这里使用了附加后的缓存规则。
四、快速缓存
上面的缓存类型都是有有效期限制的,快速缓存是用来解决没有有效期需求的数据缓存的,同时支持多种缓存类型,系统默认还提供了F方法方便快速操作缓存,这个方法可以动态设置快速缓存的位置(默认保存在DATA_PATH)、获取缓存、删除及还可以自动创建缓存子目录。
具体如下所示,详细请看代码注释说明:
接口代码:
// 快速缓存(存储类型为默认File方式)
public function cacheForFast() {
header('Content-Type:text/html;charset=utf-8');
$data= 'Cache Data ForFast!';
// 缓存设置(默认位置DATA_PATH)
F('cache',$data);
// 缓存读取
echo F('cache').'</br>';
// 缓存设置(指定位置TEMP_PATH)
F('cache_tmp',$data,TEMP_PATH);
// 缓存读取
echo F('cache_tmp').'</br>';
// 缓存自动创建子目录(默认DATA_PATH下创建)
F('Cache/cache_tmp_dir',$data);
// 缓存读取
echo F('Cache/cache_tmp_dir');
}
浏览器结果:
缓存位置结果:
删除缓存结果:
// 快速缓存(存储类型为默认File方式)
public function cacheForFast() {
header('Content-Type:text/html;charset=utf-8');
$data= 'Cache Data ForFast!';
// 缓存设置(默认位置DATA_PATH)
F('cache',$data.'1');
// 缓存读取
echo F('cache').'</br>';
// 缓存设置(指定位置TEMP_PATH)
F('cache_tmp',$data.'2',TEMP_PATH);
// 缓存读取
echo F('cache_tmp').'</br>';
// 缓存自动创建子目录(默认DATA_PATH下创建)
//F('Cache/cache_tmp_dir',$data.'3');
// 缓存读取
//echo F('Cache/cache_tmp_dir');
// 缓存删除(删除默认DATA_PATH下缓存)
F('Cache/cache_tmp_dir',NULL);
echo F('Cache/cache_tmp_dir');
}
浏览器结果:
缓存位置结果:
好了,到这里四种缓存类型也已经介绍完了,具体何时使用,使用哪种缓存方式,需要根据实际需求而定,缓存的多种类型,例如:Memcache、Redis等会在专题篇中介绍,谢谢。
技术讨论群:489451956(新)