tp缓存

在项目中,合理的使用缓存对性能有较大的帮助。ThinkPHP提供了方便的缓存方式,包括数据缓存、静态缓存和查询缓存等,支持包括文件方式、APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache在内的动态数据缓存类型,以及可定制的静态缓存规则,并提供了快捷方法进行存取操作。

数据缓存

在ThinkPHP中进行缓存操作,一般情况下并不需要直接操作缓存类,因为系统内置对缓存操作进行了封装,3.1版本推荐的数据缓存方法是cache方法,基本的用法是:
(3.1.2版本cache方法已经并入S方法,所以cache方法不再建议使用,直接使用S方法即可,和下文描述的cache方法用法一致)

1 缓存初始化

  1. cache(array(‘type‘=>‘xcache‘,‘expire‘=>60));

复制代码

缓存初始化可以支持的参数根据不同的缓存方式有所区别,常用的参数是:

expire

缓存有效期(时间为秒)

prefix

缓存标识前缀

type

缓存类型

核心版本只有File缓存方式的支持,其他的缓存方式支持需要下载单独的缓存驱动,并放入系统目录的Extend/Driver/Cache/下面,否则会出现不支持缓存类型的错误提示。

有些缓存方式会有一些自身特殊的参数,例如Memcache缓存,还需要配置其他的参数:

  1. cache(array(‘type‘=>‘memcache‘,‘host‘=>‘192.168.1.10‘,‘port‘=>‘11211‘,‘prefix‘=>‘think‘,‘expire‘=>60));

复制代码

对于全局的缓存方式,一般我们建议添加prefix(缓存前缀)参数用以区分不同的应用,以免混淆。

2 缓存设置

  1. cache(‘a‘,$value);

复制代码

会按照缓存初始化时候的参数进行缓存数据,也可以在缓存设置的时候改变参数,例如:

  1. cache(‘a‘,$value,300);// 缓存数据300秒

复制代码

甚至改变之前的缓存方式或者更多的参数:

  1. cache(‘a‘,$value,array(‘type‘=>‘file‘,‘expire‘=>300));// 采用文件方式缓存数据300秒

复制代码

如果你在缓存设置的时候采用上面的数组方式传入参数的话,会影响到后面的缓存存取。

3 缓存读取

  1. $value = cache(‘a‘);

复制代码

缓存读取的是前面缓存设置的值,这个值会受缓存初始化或者缓存设置的时候传入的参数影响。
如果缓存标识不存在或者已经过期,则返回false,否则返回缓存值。

4 缓存删除

  1. cache(‘a‘,null);

复制代码

删除缓存标识为name的缓存数据。

如果要切换缓存方式,可以再次进行缓存初始化操作或者使用下面的方式:

  1. $cache = cache(array(‘type‘=>‘xcache‘,‘prefix‘=>‘think‘,‘expire‘=>600));
  2. $cache->name = ‘value‘; // 设置缓存
  3. $value = $cache->name; // 获取缓存
  4. unset($cache->name); // 删除缓存

复制代码

如果你设置了缓存前缀的话,对应的缓存操作只是对应该缓存前缀标识的,不会影响其他的缓存。 
数据缓存可以支持缓存队列,简单的说就是可以限制缓存的数量,只需要在初始化的时候指定length参数:

  1. cache(array(‘type‘=>‘xcache‘,‘length‘=>100,‘expire‘=>60));

复制代码

设置了length参数后,系统只会缓存最近的100条缓存数据。

快速缓存

如果你仅仅是希望用文件的方式缓存一些简单的数据,并且没有有效期的概念,那么系统还提供了一个快速缓存方法F可以用来更快的操作。
快速缓存Data数据,默认保存在DATA_PATH目录下面

  1. F(‘data‘,$Data);

复制代码

快速缓存Data数据,保存到指定的目录

  1. F(‘data‘,$Data,TEMP_PATH);

复制代码

获取缓存数据

  1. $Data = F(‘data‘);

复制代码

删除缓存数据

  1. F(‘data‘,NULL);

复制代码

F方法支持自动创建缓存子目录,在DATA_PATH目录下面缓存data数据,如果User子目录不存在,则自动创建:

  1. F(‘User/data‘,$Data);

复制代码

3.1.2版本开始F方法支持使用通配符批量删除功能,使用如下:

  1. F(‘User/*‘,NULL);

复制代码

表示删除DATA_PATH.‘User/‘目录下面的数据缓存。
系统内置的数据字段信息缓存就是用了快速缓存机制。

查询缓存

对于及时性要求不高的数据查询,我们可以使用查询缓存功能来提高性能,而且无需自己使用缓存方法进行缓存和获取。
查询缓存功能支持所有的数据库,并且支持所有的缓存方式和有效期。
在使用查询缓存的时候,只需要调用Model类的cache方法,例如:

  1. $Model->cache(true)->select();

复制代码

如果使用了cache(true) ,则在查询的同时会根据当前的查询SQL生成查询缓存,默认情况下缓存方式采用DATA_CACHE_TYPE参数设置的缓存方式(系统默认值为File表示采用文件方式缓存),缓存有效期是DATA_CACHE_TIME 参数设置的时间,也可以单独制定查询缓存的缓存方式和有效期:

  1. $Model->cache(true,60,‘xcache‘)->select();

复制代码

表示当前查询缓存的缓存方式为xcache,并且缓存有效期为60秒。
同样的查询,如果没有使用cache方法,则不会获取或者生成任何缓存,即便是之前调用过Cache方法。
查询缓存只是供内部调用,如果希望查询缓存开放给其他程序调用,可以指定查询缓存的Key,例如:

  1. $Model->cache(‘cache_name‘,60)->select();

复制代码

则可以在外部通过S方法直接获取查询缓存的内容,

  1. $value = S(‘cache_name‘);

复制代码

除了select方法之外,查询缓存还支持find和getField方法,以及他们的衍生方法(包括统计查询和动态查询方法)。具体应用的时候可以根据需要选择缓存方式和缓存有效期。

静态缓存

要使用静态缓存功能,需要开启HTML_CACHE_ON 参数,并且使用HTML_CACHE_RULES配置参数设置静态缓存规则文件 。
静态规则的定义方式如下:

  1. ‘HTML_CACHE_ON‘=>true, // 开启静态缓存
  2. ‘HTML_FILE_SUFFIX‘  =>  ‘.shtml‘, // 设置静态缓存后缀为.shtml
  3. ‘HTML_CACHE_RULES‘=> array(
  4. ‘ActionName(小写)‘            => array(‘静态规则‘, ‘静态缓存有效期‘, ‘附加规则‘),
  5. ‘ModuleName(小写)‘            => array(‘静态规则‘, ‘静态缓存有效期‘, ‘附加规则‘),
  6. ‘ModuleName(小写):ActionName(小写)‘ => array(‘静态规则‘, ‘静态缓存有效期‘, ‘附加规则‘),
  7. ‘*‘                     => array(‘静态规则‘, ‘静态缓存有效期‘, ‘附加规则‘),
  8. //…更多操作的静态规则
  9. )

复制代码

静态缓存文件的根目录在HTML_PATH 定义的路径下面,并且只有定义了静态规则的操作才会进行静态缓存。
第一种是定义全局的操作静态规则,例如定义所有的read操作的静态规则为:

  1. ‘read‘=>array(‘{id}‘,‘60‘)

复制代码

其中,{id} 表示取$_GET[‘id‘] 为静态缓存文件名,第二个参数表示缓存60秒
第二种是定义全局的模块静态规则,例如定义所有的User模块的静态规则为:

  1. ‘user:‘=>array(‘User/{:action}_{id}‘,‘600‘)

复制代码

其中,{:action} 表示当前的操作名称
第三种是定义某个模块的操作的静态规则,例如,我们需要定义Blog模块的read操作进行静态缓存

  1. ‘blog:read‘=>array(‘{id}‘,0)

复制代码

有个别特殊的规则,例如空模块和空操作的静态规则的定义,可以使用下面的方式:

  1. ‘empty:index‘=>array(‘{:module}_{:action}‘,0)  // 定义空模块的静态规则
  2. ‘User:_empty‘=>array(‘User/{:action}‘,0)  // 定义空操作的静态规则

复制代码

第四种方式是定义全局的静态缓存规则,这个属于特殊情况下的使用,任何模块的操作都适用,例如

  1. ‘*‘=>array(‘{$_SERVER.REQUEST_URI|md5}‘),

复制代码

根据当前的URL进行缓存

静态规则是用于定义要生成的静态文件的名称,静态规则的定义要确保不会冲突,写法可以包括以下情况:
1、使用系统变量 包括 _GET _REQUEST _SERVER _SESSION _COOKIE
格式:
{$_×××|function}

例如:

  1. {$_GET.name}
  2. {$_SERVER. REQUEST_URI|md5}

复制代码

2、使用框架特定的变量
例如:{:app}、{:group} 、{:module} 和{:action} 分别表示当前项目名、分组名、模块名和操作名。

3、使用_GET变量
{var|function} 也就是说 {id} 其实等效于 {$_GET.id}

4、直接使用函数
{|function} 例如:

  1. {|time}

复制代码

5、支持混合定义,例如我们可以定义一个静态规则为:

  1. ‘{id},{name|md5}‘

复制代码

在{}之外的字符作为字符串对待,如果包含有”/”,会自动创建目录。
例如,定义下面的静态规则:

  1. {:module}/{:action}_{id}

复制代码

则会在静态目录下面创建模块名称的子目录,然后写入操作名_id.shtml 文件。
静态有效时间 单位为秒。如果不定义,则会获取配置参数HTML_CACHE_TIME 的设置值,如果定义为0则表示永久缓存。
附加规则通常用于对静态规则进行函数运算,例如

  1. ‘read‘=>array(‘Think{id},{name}‘,‘60‘, ‘md5‘)

复制代码

翻译后的静态规则是 md5(‘Think‘.$_GET[‘id‘]. ‘, ‘.$_GET[‘name‘]);
和静态缓存相关的配置参数包括:

  1. HTML_CACHE_ON 是否开启静态缓存功能
  2. HTML_FILE_SUFFIX 静态文件后缀 惯例配置的值是 .html
  3. HTML_CACHE_TIME 默认的静态缓存有效期 默认60秒 可以在静态规则定义覆盖

复制代码

总结

要善于利用ThinkPHP的缓存功能,更重要的是区分什么时候用何种缓存方式更加有效。缓存也不是万能的,没有缓存是万万不能的^_^

时间: 2024-08-08 19:02:39

tp缓存的相关文章

TP缓存设计方案解析

TP的缓存主要依赖Cache类,Cache类其实是一个代理类,Cache类通过getInstance静态方法来获取缓存实例,而getInstance方式实际是调用Cache类的connect方法,该方法类似于工厂返回对应缓存类型的驱动实例,这里以Redis为例,那么这里返回的就是CacheRedis驱动,该驱动在构造函数中会实例Redis扩展类,并赋值给handle属性来做本地代理,所以我们可以像使用Redis类一样的使用CahceRedis,并重写get和set方法,提供对外的统一接口. 查询

php面试总结

总结: php部分我是按照面试常问的问题总结的,下面的问题在面试中出场率很高.问题比较基础 --------------------PHP部分--------------------- PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别 1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 2:print:是语句不是函数,有返回值 1 ,只能输出一个

PHP面试出场率较高的题目<转载>

--------------------PHP部分--------------------- PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别 1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 2:print:是语句不是函数,有返回值 1 ,只能输出一个变量,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 3:p

php面试

------------------------------------PHP部分------------------------------------- 1.HTTP Keep-Alive的作用 作用:Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.Web服务器,基本上都支持HTTP Keep-Alive. 缺点:对于提供静态内容的网站来说,这个功能通常很有用.但是,对于负担较重的网站来说,虽然为客户保留

php常见的面试题目, php考试

--------------------PHP部分--------------------- PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别 1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 2:print:是语句不是函数,有返回值 1 ,只能输出一个变量,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 3:p

tp数据表字段缓存

在维护一个tp写的项目,因为需要在产品表product中增加了一个字段status,但是不论如何就是无法给status赋值,查了资料才发现,原来是tp的数据表字段缓存在搞鬼. 在runtime>Data>_fields文件中找到对应的文件,文件名与表名同,这里是Product.php,增加status.再次尝试,立马就可以了. 在网上看到一篇讲这个问题的文章如下, 今天在应用thinkphp框架开发的程序做些二次开发修改, 其中有改动到数据结构,新增了几个字段. 调用 M(‘xxx’)->

TP框架学习(一)

www.thinkphp.cn TP官网 一个项目->应用->模块->[组->]控制器->方法(代码) TP框架:ThinkPHP 目录结构: Common核心公共函数目录 functions.php系统函数库 特点:用一个大写字母作为函数名.函数说明1.函数功能,2.参数,3.返回值. Conf核心配置目录 convention.php惯例配置 默认配置全是在这里配置. debug.php Lang核心语言包目录 Library框架类库目录 Behavior 行为的类库目录

TP框架对数据库的基本操作

数据库的操作,无疑就是连接数据库,然后对数据库中的表进行各种查询,然后就是对数据的增删改的操作,一步步的讲述一下框架对数据库的操作 想要操作数据库,第一步必然是要:链接数据库 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写config.php文件 我这里是这样的文件路径 (2)打开这个config.php文件,然后找到父类配置文件convention.php文件,将关于"数据库"的部分复制粘贴到config.php配置文件中 1 2 3 4 5 6 7 8 9 /

第九十九天上课 PHP TP框架 数据库查询和增加

在Model文件夹下创建模型,文件命名规则 : 表名Model.class.php <?php namespace Home\Model; use Think\Model; class yonghuModel extends Model { } 实例化数据库的三种方法 //调用Model文件夹下的模型 public function shujuku1() { $yonghu=new \Home\Model\yonghuModel; //实例化自己创建的Model,(注意路径书写完整) var_d