ThinkPHP3.1快速入门(10)缓存

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

数据缓存

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

1缓存初始化

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

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

expire 缓存有效期(时间为秒) prefix 缓存标识前缀 type 缓存类型

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

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

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

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

2缓存设置

cache(‘a’,$value);

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

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

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

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

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

3缓存读取

$value = cache(‘a’);

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

4缓存删除

cache(‘a’,null);

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

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

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

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

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

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

快速缓存

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

F(‘data’,$Data);

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

F(‘data’,$Data,TEMP_PATH);

获取缓存数据

$Data = F(‘data’);

删除缓存数据

F(‘data’,NULL);

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

F(‘User/data’,$Data);

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

F(‘User/*’,NULL);

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

查询缓存

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

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

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

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

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

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

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

$value = S(‘cache_name’);

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

静态缓存

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

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

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

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

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

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

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

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

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

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

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

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

根据当前的URL进行缓存

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

例如:

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

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

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

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

{|time}

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

‘{id},{name|md5}’ 

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

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

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

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

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

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

总结

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

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » ThinkPHP3.1快速入门(10)缓存

6 评论

  1. natural cures for blood pressure But there will always be a way, this Rogge does garlic reduce high blood pressure is confident, After turning high blood pressure medications around in the territory, Rogge and does garlic reduce high blood pressure other nobles were extremely satisfied with this thriving territory can you buy cialis online Approximately 25 of the mice with ER 4T1

  2. 2010 Nov; 88 5 626 9 propecia hair loss The strategy of Poland s southern neighbors is characteristic of small states, which try to take on supporting roles, freeing stronger actors from the need to deal with less important matters

  3. However, there are cases where the organism may be affected more significantly by the use of SARM Ostarine, resulting in the need for a PCT treatment cycle to restore their hormonal balance what color are viagra pills

  4. Among 3, 147 patients, 1, 120 developed AKI and the 60 day mortality was higher in the patients with AKI 36 compared with those without AKI 15 viagra pill for women levitra ciprofloxacino 500mg medley bula However, in August 2008, during the war between Russia and Georgia over South Ossetia, Russian army troops moved through Abkhazia and pushed into Georgia proper, effectively using the region to open another front with Georgia

  5. propecia ireland Ritonavir boosted nirmatrelvir is expected to be active against the B

评论已关闭

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡