[php] ThinkPHP缓存技术(S(),F(),查询缓存,静态缓存)

来源:互联网 发布:php开发框架 编辑:程序博客网 时间:2024/05/19 01:12

Thinkphp缓存有:

  1. 数据缓存
  2. 快速缓存
  3. 查询缓存
  4. SQL解析缓存
  5. 静态缓存

记:一旦内容被缓存了,在有效期内,可以在任何地方调用


一、数据缓存S(缓存类型type,文件名前缀prefix,有效期expire)方法

在Index控制器的index方法下写入

// 缓存初始化S(array('type'=>'File','expire'=>60));// 设置缓存S('name','张三');echo S('name');

访问方法后,会在运行目录下的临时目录生成缓存文件



缓存文件的内容:

//000000000060s:6:"张三";
以冒号分隔,第一个是时间,第二个是字符串长度,第三个是缓存内容


tp_是文件名前缀,因为有效期是60秒,所以过了60秒此文件就会自动删除

当然也可以手动删除缓存文件

S('name',null);

也可以这样来删除缓存

// 缓存初始化$cache = S(array('type'=>'File','prefix'=>'tp_','expire'=>60));// 设置缓存S('name','张三');// 删除缓存unset($cache->name);

除此之外,还可以限制缓存的长度,只需在初始化时传入参数length

S(array('type'=>'File','length'=>10,'prefix'=>'tp_','expire'=>60));

如果缓存超出10条,缓存文件会把开始缓存的内容删掉只保留10条,删除的规则是先进先出的规则 ,就是先设置的先删除。打个比方,如果缓存内容为11条,那么会打第一条删除。。


二、快速缓存F(name, value)方法,没有缓存的有效期设置,意思是不手动删除,这是永久存在的

在Index控制器的index方法下写入

// 设置缓存F('name', '张三');// 输出缓存echo F('name');

访问方法后,会在运行目录下的数据目录生成缓存文件,文件名是缓存的键



缓存文件内容(同S方法缓存文件内容一样,只不过这里没有缓存有效期):

s:6:"张三";

F方法缓存还支持自动创建子目录的形式

F('user/common/name', '张三');echo F('user/common/name');

对应的目录文件



删除缓存同S方法的写法一样

F('user/common/name', null);

name.php 文件会被删除,但目录结构不会被删除。。


三、查询缓存


用这张表来做示范,表名tp_account

缓存id=3的数据,然后打印出来

$account = M('account');$data = $account->cache(true)->where("id=3")->select();print_r($data);

缓存文件保存在运行目录的临时目录里,缓存内容是以对象的形式存储的

//000000000000a:1:{i:0;a:5:{s:2:"id";s:1:"3";s:5:"uname";s:7:"zhangqh";s:3:"pwd";s:6:"123456";s:5:"phone";s:11:"13174125874";s:5:"email";s:13:"123456@qq.com";}}

cache(true) 在查询的同时会根据当前的查询条件等信息生成一个带有唯一标识的查询缓存,这里没有指定key

在指定key的情况下:

$account = M('account');$data = $account->cache('third')->where("id=3")->select();dump(S('third'));

输出结果:

array  0 =>     array      'id' => string '3' (length=1)      'uname' => string 'zhangqh' (length=7)      'pwd' => string '123456' (length=6)      'phone' => string '13174125874' (length=11)      'email' => string '123456@qq.com' (length=13)

指定有效期为3秒,过了有效期缓存文件会自动删除,手动删除使用S方法的删除方法就行了

$data = $account->cache('third',3)->where("id=3")->select();

使用cache(key) 更容易查询


四、SQL解析缓存

如果你的应用有大量的SQL查询需求,那么可以开启SQL解析缓存以减少SQL解析提高性能。要开启SQL解析缓存,只需要设置:

'DB_SQL_BUILD_CACHE' => true,  // 开启SQL缓存'DB_SQL_BUILD_QUEUE' => 'File', // SQL缓存队列类型'DB_SQL_BUILD_LENGTH' => 20, // SQL缓存长度

注意:只有查询方法才支持SQL解析缓存


五、静态缓存

静态缓存配置(演示的是全局规则配置)

'HTML_CACHE_ON'     =>    true, // 开启静态缓存'HTML_CACHE_TIME'   =>    60,   // 全局静态缓存有效期(秒)'HTML_FILE_SUFFIX'  =>    '.shtml', // 设置静态缓存文件后缀'HTML_PATH' => __APP__ .'/Html/',   // 指定缓存文件存放目录'HTML_CACHE_RULES'  =>     array(  // 定义静态缓存规则    'index'=>array('{file}',60))

当访问http://localhost/demo/home/index/index/file/test 里会在Html目录里生成test.html缓存文件


静态地址包括下面几种定义格式:

第一种是定义全局的操作静态规则,例如定义所有的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. '*'=>array('{$_SERVER.REQUEST_URI|md5}'),

表示根据当前的URL进行缓存。


好了,就写到这里了,如果想了解更多,可以查看官方手册:http://document.thinkphp.cn/manual_3_2.html#html_cache


谢谢关注!微笑





0 0
原创粉丝点击