入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

tp缓存

创建时间:2017-04-20 投稿人: 浏览次数:392

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");

   }

浏览器结果:

 

缓存位置结果:

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。