ThinkPHP实现静态缓存和动态缓存示例代码


Posted in PHP onMay 02, 2017

静态缓存

要使用静态缓存功能,需要开启HTML_CACHE_ON参数,并且使用HTML_CACHE_RULES配置参数设置静态缓存规则文件。

定义静态规则

'HTML_CACHE_ON'   =>  true, // 开启静态缓存
'HTML_CACHE_TIME'  =>  60,  // 全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX' =>  '.shtml', // 设置静态缓存文件后缀
'HTML_CACHE_RULES' =>   array( // 定义静态缓存规则
   // 定义格式1 数组方式
   '静态地址'  =>   array('静态规则', '有效期', '附加规则'), 
   // 定义格式2 字符串方式
   '静态地址'  =>   '静态规则', 
)

静态缓存文件的根目录在HTML_PATH定义的路径下面,并且只有定义了静态规则的操作才会进行静态缓存。 并且静态缓存支持不同的存储类型。 静态缓存仅在GET请求下面有效。

静态地址

全局的操作静态规则

'read'=>array('{id}',60)//定义所有的read操作的静态规则

定义全局的控制器静态规则

'user:'=>array('User/{:action}_{id}','600')//定义所有的User控制器的静态规则

定义某个控制器的操作的静态规则//定义Blog控制器的read操作进行静态缓存

'blog:read'=>array('{id}',0)//参数为0表示永久缓存

定义全局的静态缓存规则

'*'=>array('{$_SERVER.REQUEST_URI|md5}')//这个属于特殊情况下的使用,任何模块的操作都适用

静态规则

静态规则是用于定义要生成的静态文件的名称,静态规则的定义要确保不会冲突。

使用系统变量

{$_×××|function}//_GET、_REQUEST、_SERVER、_SESSION、_COOKIE
{$_GET.name} 
{$_SERVER.REQUEST_URI|md5}

使用框架自定义的变量

{:module}/{:controller}_{:action}//{:module} 、{:controller} 和{:action}分别表示当前模块名、控制器名和操作名。

使用_GET变量

{var|function}//{id}其实等效于 {$_GET.id}

直接使用函数

{|function}//{|time},time函数获取时间后作为文件名称

混合定义

'{id},{name|md5}' //在{}之外的字符作为字符串对待,如果包含有"/",会自动创建目录。
{:module}/{:action}_{id}//会在静态目录下面创建模块名称的子目录,然后写入操作名_id.shtml 文件。

动态缓存

[S方法数据缓存]

缓存初始化

S(array('type'=>'xcache','expire'=>60));

系统目前已经支持的缓存类型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache。如果S方法不传入type参数初始化的话,则读取配置文件中设置的DATA_CACHE_TYPE参数值作为默认类型。同样的道理,prefix参数如果没有传入会读取配置文件的DATA_CACHE_PREFIX参数值,expire参数没有传入则读取DATA_CACHE_TIME配置值作为默认。

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

设置缓存

数据缓存可以支持缓存队列,简单的说就是可以限制缓存的数量,只需要在初始化的时候指定length参数。

S('name',$value);
S('name',$value,300);//缓存数据300秒
S('name',$value,array('type'=>'file','expire'=>300));//改变之前的缓存方式或者更多的参数
S(array('type'=>'xcache','length'=>100,'expire'=>60));//系统只会缓存最近的100条缓存数据。

读取缓存

$value = S('name');//如果缓存标识不存在或者已经过期,则返回false,否则返回缓存值。

删除缓存

S('name',null);

注意:使用每种缓存时,需要ThinkPHP加载对应的驱动文件,并设置好对应的配置。

使用实例

$user = M('User');
$value = S('list');
if (empty($value)) {
  $list = $user->select();
  S('list', $list, 3600);
  echo '这个是直接从数据库中读取的文件';
  dump($list);
} else {
  echo '这个是缓存文件';
  dump($value);
}

[快速缓存]

系统还提供了一个快速缓存方法F可以用来更快的操作,但是,F方法没有有效期,F方法可以支持不同的存储类型,如果是文件类型的话,默认保存在DATA_PATH目录下面。

快速缓存Data数据

F('data',$Data);
F('data',$Data,TEMP_PATH);//快速缓存Data数据,保存到指定的目录
F('User/data',$Data);//F方法支持自动创建缓存子目录,在DATA_PATH目录下面缓存data数据,如果User子目录不存在,则自动创建。

获取缓存数据

$Data = F('data');

删除缓存数据

F('data',NULL);

[查询缓存]

查询缓存功能支持所有的数据库,并且支持所有的缓存方式和有效期。

在使用查询缓存的时候,只需要调用Model类的cache方法。

$Model->cache(true)->where('status=1')->select();

如果使用了cache(true),则在查询的同时会根据当前的查询条件等信息生成一个带有唯一标识的查询缓存,如果指定了key的话,则直接生成名称为key的查询缓存。

$Model->cache('cache_name')->select();

默认情况下缓存方式采用DATA_CACHE_TYPE参数设置的缓存方式(系统默认值为File表示采用文件方式缓存),缓存有效期是DATA_CACHE_TIME参数设置的时间,也可以单独制定查询缓存的缓存方式和有效期。

$Model->cache(true,60,'xcache')->select();

如果指定了查询缓存的key的话,则可以在外部通过S方法直接获取查询缓存的内容。

$value = S('cache_name');

除了select方法之外,查询缓存还支持find和getField方法,以及他们的衍生方法(包括统计查询和动态查询方法)。

$Model->where($map)->cache('key',60)->find();

本文主要来自官方文档,如有问题可参见ThinkPHP3.2官方文档-缓存

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
使用PHP和XSL stylesheets转换XML文档
Oct 09 PHP
php中计算时间差的几种方法
Dec 31 PHP
mysql下创建字段并设置主键的php代码
May 16 PHP
浅析PHP的ASCII码转换类
Jul 05 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
linux下安装php的memcached客户端
Aug 03 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
Oct 30 PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
在laravel中实现将查询的对象转换为多维数组的函数
Oct 21 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
php 函数使用可变数量的参数方法
May 02 #PHP
PHP 序列化和反序列化函数实例详解
Jul 18 #PHP
php头像上传预览实例代码
May 02 #PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 #PHP
AJAX的使用方法详解
Apr 29 #PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 #PHP
PHP编程实现csv文件导入mysql数据库的方法
Apr 29 #PHP
You might like
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
php实现评论回复删除功能
2017/05/23 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
python中引用与复制用法实例分析
2015/06/04 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
基于python plotly交互式图表大全
2019/12/07 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
求职者简历中的自我评价
2013/10/20 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
医德考评自我评价
2014/09/14 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python
Python实现socket库网络通信套接字
2021/06/04 Python
 python中的元类metaclass详情
2022/05/30 Python