tp缓存
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");
}
浏览器结果:
缓存位置结果:
- 上一篇: php中如何实现将数组中的某个下标的值累计相加
- 下一篇:没有了