[置顶] ThinkPHP框架总结之缓存及使用

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

   }

浏览器结果:

[置顶] ThinkPHP框架总结之缓存及使用_第1张图片

 

缓存位置结果:

[置顶] ThinkPHP框架总结之缓存及使用_第2张图片

 

 

 

好了,到这里四种缓存类型也已经介绍完了,具体何时使用,使用哪种缓存方式,需要根据实际需求而定,缓存的多种类型,例如:Memcache、Redis等会在专题篇中介绍,谢谢。

 

 

 

 

 

 

 

 

 

 

 

技术讨论群:489451956(新)

 

你可能感兴趣的:(框架,缓存,thinkphp)