ThinkPhp数据缓存技术
1.缓存初始化
在 ThinkPHP 中,有一个专门处理缓存的类:Cache.class.php(在Thinkphp/Library/Think/cache.class.php,其他的各种缓存类也在这个文件夹下)。
而我们使用的时候,并不需要直接声明它,直接使用一个大 S()方法即可
ThinkPhp系统内置对缓存操作进行了封装,直接采用S方法。
// 缓存初始化
S(array('type'=>'xcache','expire'=>60));
缓存初始化,要指明缓存类型和缓存时间。
1.1缓存类型
ThinkPhp系统目前已经支持的缓存类型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache
。
1.1.1不同的缓存类型以及参数
①Apachenote:host 缓存服务器地址( 默认为127.0.0.1)
②Apc:
APC缓存扩展,windows下面为php_apc.dll,需要先加载这个模块,然后是在php.ini里面进行配置:
[apc] extension=php_apc.dll apc.rfc1867 = on upload_max_filesize = 100M
post_max_size = 100M apc.max_file_size = 200M upload_max_filesize =
1000M post_max_size = 1000M max_execution_time = 600 ;
每个PHP页面运行的最大时间值(秒),默认30秒 max_input_time = 600 ; 每个PHP页面接收数据所需的最
大时间,默认60
memory_limit = 128M ; 每个PHP页面所吃掉的最大内存,默认8M
③Db:db 数据库名称(默认由DB_NAME参数配置)
table 数据表名称(默认由DATA_CACHE_TABLE参数配置)
④Eaccelerator:
原理:
eAccelerator 通过把经过编译后的PHP代码缓存到共享内存中,并在用户访问的时候直接调用从而起到高效的加速作用。它的效率非常高,从创建共享内存到查找编译后的代码 都在非常短的时间内完成,对于不能缓存到共享内存中的文件和代码,eAccelerator还可以把他们缓存到系统磁盘上。
eAccelerator 同样还支持PHP代码的编译和解释执行,你可以通过encoder.php脚本来对php代码进行编译达到保护代码的目的,经过编译后的代码必须运行在安 装了eAccelerator的环境下。eAccelerator编译后的代码不能被反编译,它不象其他一些编译工具那样可以进行反编译,这将使得代码更 加安全和高效。
具体的暂时先参考:https://my.oschina.net/angelangel/blog/338458,待我整理了,给大家呈现。
⑤File:temp 缓存目录(默认由DATA_CACHE_PATH参数配置)
⑥Memcache:
缓存初始化参数配置:

S(array(
'type'=>'memcache', //类型
'host'=>'192.168.1.10', //服务器地址
'port'=>'11211', //服务器端口
'prefix'=>'think', //缓存标示前缀
'expire'=>60) //缓存有效时间
);

host 缓存服务器地址( 默认为127.0.0.1)
port 端口(默认为MEMCACHE_PORT参数或者11211)
timeout 缓存超时(默认由DATA_CACHE_TIME参数设置)
persistent 长连接(默认为false)
⑦Redis:host 服务器地址(默认由REDIS_HOST参数配置或者127.0.0.1)
port端口(默认由REDIS_PORT参数配置或者6379)
timeout 超时时间(默认由DATA_CACHE_TIME配置或者false)
persistent长连接(默认为false)
⑧Shmop:size(默认由SHARE_MEM_SIZE参数设置)
tmp(默认为TEMP_PATH)
project (默认为s)
length 缓存队列长度(默认为0)
⑨Sqlite:db 数据库名称(默认:memory:)
table 表名(默认为sharedmemory)
persistent 长连接(默认为false)
⑩Wincache:
①①Xcache:
ThinkPhp既然有不同的缓存类型,那么TP的缓存初始化可以支持的参数根据不同的缓存方式是有所区别的,常用的参数有
参数 | 作用 |
---|---|
expire | 缓存有效期(时间为秒) |
prefix | 缓存标识前缀 |
type | 缓存类型 |
如果S方法不传入type参数初始化的话,则读取配置文件中设置的DATA_CACHE_TYPE
参数值作为默认类型。同样的道理,prefix参数如果没有传入会读取配置文件的DATA_CACHE_PREFIX
参数值,expire参数没有传入则读取DATA_CACHE_TIME
配置值作为默认。
2.缓存设置
// 设置缓存
S('a',$value);
我们的TP会按照缓存初始化时候的参数进行缓存数据,我们也可以在缓存设置的时候改变参数
// 缓存数据300秒
S('a',$value,300);
3.缓存读取
// 读取缓存
$value = S('a');
缓存读取的是前面缓存设置的值,这个值会受缓存初始化或者缓存设置的时候传入的参数影响。 如果缓存标识不存在或者已经过期,则返回false,否则返回缓存值。
4.删除缓存
// 删除缓存
S('a',null);
删除缓存标识为name的缓存数据。
5.对象方式操作缓存

// 初始化缓存
$cache = S(
array(
'type'=>'xcache',
'prefix'=>'think',
'expire'=>600)
);
$cache->name = 'value'; // 设置缓存
$value = $cache->name; // 获取缓存
unset($cache->name); // 删除缓存

6.缓存队列
S(array(
'type'=>'xcache', //缓存类型
'length'=>100, //限制的缓存数量
'expire'=>60)); //有效缓存时间
设置限制缓存数量,系统只会缓存最近的100条缓存数据。
7.快速缓存
如果我们没有设置expire参数,系统还提供了一个快速缓存方法F可以用来更快的操作
•F方法可以支持不同的存储类型,如果是文件类型的话,默认保存在DATA_PATH目录下面。
7.1快速缓存Data数据
F('data',$Data);
7.2快速缓存Data数据,保存到指定的目录
F('data',$Data,TEMP_PATH);
7.3获取缓存数据
$Data = F('data');
7.4删除缓存数据
F('data',NULL);
7.5F方法支持自动创建缓存子目录,在DATA_PATH
目录下面缓存data数据,如果User子目录不存在,则自动创建:
F('User/data',$Data);
8.查询缓存
进行查询缓存的原因:对于及时性要求不高的数据查询,我们可以使用查询缓存功能来提高性能,而且无需自己使用缓存方法进行缓存和获取。
$Model->cache(true)->where('status=1')->select();
如果使用了cache(true)
,则在查询的同时会根据当前的查询条件等信息生成一个带有唯一标识的查询缓存,如果指定了key的话,则直接生成名称为key的查询缓存 :
$Model->cache('cache_name')->select();
•指定key的方式会让查询缓存更加高效。
•默认情况下缓存方式采用DATA_CACHE_TYPE参数设置的缓存方式(系统默认值为File表示采用文件方式缓存),缓存有效期是DATA_CACHE_TIME参数设置的时间,也可以单独制定查询缓存的缓存方式和有效期:
$Model->cache(true,60,'xcache')->select();
//缓存方式为xcache,并且缓存有效期为60秒
•如果指定了查询缓存的key的话,则可以在外部通过S方法直接获取查询缓存的内容
$value = S('cache_name');
select方法之外,查询缓存还支持find和getField方法,以及他们的衍生方法
// 对查询数据缓存60秒
$Model->where($map)->cache('key',60)->find();
9.SQL解析缓存
使用SQL解析缓存的原因:如果我们的应用有大量的SQL查询需求,那么可以开启SQL解析缓存以减少SQL解析提高性能。
•只有查询方法才支持SQL解析缓存
开启SQL解析缓存(默认缓存方式为文件方式):
'DB_SQL_BUILD_CACHE' => true
SQL缓存还支持xcache和apc方式缓存,设置方式:
'DB_SQL_BUILD_QUEUE' => 'xcache',
'DB_SQL_BUILD_QUEUE' => 'apc',
一个项目的查询SQL的量可能会非常巨大,所以有必要设置下缓存的队列长度,设置方式:
'DB_SQL_BUILD_LENGTH' => 20, // SQL缓存的队列长度
10.静态缓存
要使用静态缓存功能,需要开启HTML_CACHE_ON
参数,并且使用HTML_CACHE_RULES
配置参数设置静态缓存规则文件 。
10.1静态规则定义

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

定义格式1采用数组方式 便于单独为某个静态规则设置不同的有效期,
定义格式2采用字符串方式订阅静态规则,同时采用HTML_CACHE_TIME
设置的全局静态缓存有效期。
•静态缓存文件的根目录在HTML_PATH
定义的路径下面,并且只有定义了静态规则的操作才会进行静态缓存。 并且静态缓存支持不同的存储类型。 静态缓存仅在GET请求下面有效。
10.2静态地址
静态地址定义格式:
①.定义全局的操作静态规则
'read'=>array('{id}',60) //定义所有的read操作的静态规则
{id}
表示取$_GET['id']
为静态缓存文件名,第二个参数表示缓存60秒
②.定义全局的控制器静态规则
'user:'=>array('User/{:action}_{id}','600') //定义所有的User控制器的静态规则
{:action}
表示当前的操作名称
③定义某个控制器的操作的静态规则
'blog:read'=>array('{id}',0) //定义Blog控制器的read操作进行静态缓存
④定义全局的静态缓存规则
'*'=>array('{$_SERVER.REQUEST_URI|md5}'), //任何模块的操作都适用
表示根据当前的URL进行缓存
10.3静态规则
静态规则是用于定义要生成的静态文件的名称,静态规则的定义要确保不会冲突
10.3.1使用系统变量
包括 _GET
、_REQUEST
、_SERVER
、_SESSION
、_COOKIE
格式:
{$_×××|function}{$_GET.name}
{$_SERVER.REQUEST_URI|md5}
10.3.2使用框架特定的变量
{:module}
、{:controller}
和{:action}
分别表示当前模块名、控制器名和操作名。
{:module}/{:controller}_{:action}
10.3.3使用_GET变量
{var|function}
也就是说 {id}
其实等效于 {$_GET.id}
10.3.4直接使用函数{|function}
{|time}
10.3.5支持混合定义
例:定义一个静态规则
'{id},{name|md5}'
在{}之外的字符作为字符串对待,如果包含有"/",会自动创建目录。
{:module}/{:action}_{id}
则会在静态目录下面创建模块名称的子目录,然后写入操作名_id.shtml 文件。
10.4静态缓存有效期
单位为秒。如果不定义,则会获取配置参数HTML_CACHE_TIME
的设置值,如果定义为0则表示永久缓存。
10.5附加规则
对静态规则进行函数运算
'read'=>array('Think{id},{name}','60', 'md5')
翻译后的静态规则是 md5('Think'.$_GET['id']. ', '.$_GET['name']);
ThinkPhp数据缓存技术的更多相关文章
- ThinkPHP的缓存技术
原文:ThinkPHP的缓存技术 如果没有缓存的网站是百万级或者千万级的访问量,会给数据库或者服务器造成很大的压力,通过缓存,大幅减少服务器和数据库的负荷.假如我们 把读取数据的过程分为三个层,第一个 ...
- thinkphp 数据缓存
在ThinkPHP中进行缓存操作,一般情况下并不需要直接操作缓存类,因为系统内置对缓存操作进行了封装,直接采用S方法即可,例如: 缓存初始化 // 缓存初始化 S(array('type'=>' ...
- ThinkPHP 缓存技术详解 使用大S方法
如果没有缓存的网站是百万级或者千万级的访问量,会给数据库或者服务器造成很大的压力,通过缓存,大幅减少服务器和数据库的负荷,假如我们把读取数据的过程分为三个层,第一个是访问层,第一个是缓存层,第三个是数 ...
- PHP中九大缓存技术总结
PHP缓存包括PHP编译缓存和PHP数据缓存两种.PHP是一种解释型语言,属于边编译边运行的那种.这种运行模式的优点是程序修改很方便,但是运行效率却很低下.PHP编译缓存针对这种情况做改进处理,使得P ...
- php缓存技术总结
缓存是指临时文件交换区,电脑把最常用的文件从存储器里提出来临时放在缓存里,就像把工具和材料搬上工作台一样,这样会比用时现去仓库取更方便.因为缓存往往使用的是RAM(断电即掉的非永久储存), ...
- 【ASP.NET 系列】浅谈缓存技术在ASP.NET中的运用
本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过涉及架构部分的内容 你只需关心Cache即 ...
- 浅谈缓存技术在ASP.NET中的运用
本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过, 你只需关心Cache即可,具体的架构, ...
- ThinkPHP 3.2.3 数据缓存与静态缓存
ThinkPHP 3.2.3 中手册中数据缓存的地址是:http://www.kancloud.cn/manual/thinkphp/1835 静态缓存的地址是:http://www.kancloud ...
- Dcloud课程5 php如何实现文件缓存技术(静态数据缓存)
Dcloud课程5 php如何实现文件缓存技术(静态数据缓存) 一.总结 一句话总结:保存在磁盘上的静态文件,用PHP生成数据到静态文件中.其实cookie和session使用的就是这样的技术,所以c ...
随机推荐
- 这段时间使用MySQL的一些记录
自从Fedora19之后,Linux上的MySQL就被MariaDB所取代,这段文字见如下引用: MySQL was replaced by MariaDB since Fedora 19 (http ...
- 视频编解码---x264用于编码,ffmpeg用于解码
项目要用到视频编解码,最近半个月都在搞,说实话真是走了很多弯路,浪费了很多时间.将自己的最终成果记录于此,期望会给其他人提供些许帮助. 参考教程: http://ffmpeg.org/trac/ffm ...
- java继承 初始化顺序
java继承 初始化顺序 标签: 初始化顺序 2013-08-01 10:13 879人阅读 评论(0) 收藏 举报 分类: java(8) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- 【转】几款移动跨平台App开发框架比较
原文地址:https://www.cnblogs.com/songxingzheng/p/6482697.html 整理目前流行的跨平台WebApp开发技术的特点,仅供参考. 每个框架几乎都包含以下特 ...
- MaxScript 学习笔记【有转载】
1. string string类型的变量是一个数组,下列操作合法:strName = $.name -- output: "Shemmy_03" strName[1] --得到字 ...
- Oracle 相关知识点结构图
最近在学Oracle数据库,制作了些结构图方便记忆!主要涉及到Oracle数据类型,Oracle的表操作以及Oracle的游标,还有的之后再分享...... Oracle 数据类型 因为图片上只能看到 ...
- JS中如何获取当前时间及让时间格式化
JS中获取当前时间和JAVA里获取当前时间一样,都是直接new Date即可.不同的是,JS中用var date=new Date();JAVA中用Data data=new Date();注:JS中 ...
- .net Core 2.0使用NLog
最近研究了一下NLog的使用方式,简单的入了一下门. 实现的功能,对于不同的日志,进行不同的记录,分别有系统运行日志,和个人在程序中写的异常日志.发布之后放在了IIS上.进行查看日志的信息 参考了两篇 ...
- Spring DI的配置使用
1.1.1 依赖和依赖注入Spring IOC容器的依赖有两层含义:Bean依赖容器和容器注入Bean的依赖资源:a.Bean依赖容器:也就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean ...
- input子系统分析之三:驱动模块
内核版本:3.9.5 本节将以even handler来分析设备的注册和打开的过程,分析之前不妨回顾一下上节介绍的数据结构. 结合前两节分析可知,input子系统分为3层,最上一层是event han ...