Drupal专业开发指南 第15章 Drupal缓存(cache)(1)

缓存

 

译者:老葛 ESKALATE科技公司

 

       为动态网站建造页面需要对数据库进行大量的数据读取,以获取诸如保存的内容、站点设置、当前用户等等诸多信息。将这些耗费资源的操作结果保存起来以备后用,这是从应用层提高一个反应缓慢站点的最简单的途径之一。Drupal内置的缓存API对大部分核心数据进行了自动缓存,并为Drupal开发者提供了一组工具以进行量身定做。

 

 

缓存是如何工作的

 

模块开发者可以将他们要缓存的数据保存到Drupal数据库中专门用于缓存的数据库表中,或者它们也可以为缓存的存储创建一个新的数据库表。当下次用到这些缓存过的信息时,可以通过一个简单的查询快速的获取这些信息,而不是在使用笨重的数据操作了。

 

  在你的模块中,你可以放置缓存信息的默认数据库表是cache。当缓存信息的数据量不大时,最好使用该表。你过你想为每个节点、菜单、用户缓存信息,你将需要为你的模块创建独有的缓存数据库表,这样就可以减小Drupalcache表的大小,从而提高新能。当要为你的模块创建一个新的缓存数据库表时,该表的数据结构一定要与cache表完全相同,不同的仅仅是表名。为了一致性,在表明前面加上前缀cache_是个不错的注意。让我们看一下cache表的结构;参看表格15-1.

 

注意; 当为你的模块创建一个新的缓存数据库表时,该表的数据结构一定要与cache表完全相同

 

15-1 cache的元数据

Field      Type       Null       Index

cid     varchar(255)    NO          PRIMARY

data    longblob       YES

expire      int         NO          MULTIPLE

created     int         NO

headers     text        YES

 

 

cid存放的是用于快速取回缓存信息的主键。在Drupal核心中使用缓存ID的例子有,用于页面缓存的页面的URL(比如,http://example.com/?q=taxonomy/term/1),用于用户菜单缓存的用户ID和本地区域(比如,1:en),或者甚至可以使用规则的字符串(比如,表variables的内容的缓存,它将缓存ID设置为了variables(译者注,这里将的缓存是将表variables的所有内容缓存在了一起))。

data用于存放你想要缓存的信息。对于复杂的数据类型比如数组或者对象,需要使用PHPserialize()函数将其序列化后从而将其数据结构也保存到数据库中。当然,这意味着当你从数据库中取回这些缓存数据时,你需要使用PHPunserialize()函数对其反序列化从而得到相应的数组或者对象。

expire采用下面的3种值:

CACHE_PERMANENT:这意味只有当针对给定永久项目的缓存ID使用cahe_clear_all(),才能删除该项目。

CACHE_TEMPORARY:这意味着当下一次不带参数调用cahe_clear_all()时,就会删除该项目,而没有最小时间限制。标记为ACHE_PERMANENT的项目此时不被删除。

一个Unix时间戳:该时间戳指的是该项目的最小存在时间,在最小时间内,就不能删除它,当过了这个时间,它就和标记为CACHE_TEMPORARY的项目性质一样了。

created是缓存项目创建的时间,它不用来决定缓存的存在周期。

headers用来存放HTTP的回应头部,在缓存的数据是整个请求的Drupal页面时使用。大多数时候,你不使用该列,这是因为你要缓存的是页面的一部份而不是整个页面,也就是说要缓存的数据不依赖于头部信息。记住,尽管如此,你定制的缓存数据库表的结构仍然需要和默认的cache表完全相同,所以尽管不使用它也要保存它。

 

知道什么时候使用缓存

 

要记住一点,使用缓存是要考虑平衡的。对大量的数据进行缓存可以对性能有很大提高,这是不假,但是这是有前提的,前提就是缓存的数据需要在接下来被多次使用。这就是为什么页面缓存仅用于匿名用户:已注册的用户看到的通常是页面的定制版本,这样缓存效果就不太明显了。对小量的数据进行缓存(比如当天的流行文章列表)尽管对你的网站性能的提高不大,但也会有所改善的。

  另外要将的是,要缓存的数据最好不要经常修改。比如,每周最佳故事列表,就比较适用。如果对于一个繁忙的论坛,缓存最近5个评论,此时效果就不太明显,因为要缓存的数据很快就会过期,在它需要被更新以前,很少有用户使用到它。在最坏的情况,一个坏的缓存策略(对改动过于频繁的数据进行缓存)可能会增加网站负担而不是提高性能。

 

Drupal核心中是如何使用缓存的

 

Drupal自带了4个缓存数据库表:cache_menu,cache_filter,cache,cache_pagecache_menu为每个用户ID存放导航菜单的缓存副本;cache_filter为每个被过滤器系统解析过的每个节点的内容存储缓存副本;cache存储模块设置,当你调用cache_set()时,它是默认的缓存表;cache_page存储匿名页面的缓存副本。我们在接下来的部分中会逐一的接讲解每一个缓存。需要注意的是,在后台Administer Site configuration Performance中的页面缓存设置仅用于页面缓存,对于Drupal中的其它缓存不起作用。换句话说,过滤器,菜单,模块设置总是被缓存的。

 

菜单系统

所有由菜单模块创建的菜单都被缓存,无论Drupal的页面缓存是否被启用。关于菜单的例子有Drupal的一级和二级链接菜单,以及用户导航区块。菜单基于单个用户、单个区域进行缓存。关于菜单系统的更多信息参看第4章。

 

过滤的输入格式

当创建或者编辑一个节点时,它的内容将通过与其输入格式相关的各种过滤器。例如,HTML过滤器格式将换行装化为HTML<p>和<br>标签,同时过滤掉恶意的HTML。如果每次简单的查看该节点时都进行过滤,那么这是很费资源的。因此,只有在创建或者编辑节点内容完以后才应用过滤器(其他时候不用)并将过滤后的内容缓存到数据库中,这同样与Drupal的页面缓存是否启用没有关系。关于输入格式的更多信息参看第11章。

 

提示 当你使用后台管理接口改变节点摘要(node teaser)的默认长度时,只有当你重新保存每个节点以后才会生效,其原因就是过滤器缓存。解决该问题的简便方法是清空表cache_filter,这样每个节点将被过滤器重新解析。

 

用于后台管理的变量和模块设置

Drupal将大多数的管理设置存储在表variables里,并将该表的所有数据缓存到表cache里以加快对配置数据的查看速度。这些变量的例子包括你站点的名称、评论和用户的设置、以及文件目录的位置。所有的这些变量被缓存到表cache中的一行记录当中,这样就可以快速的取回它们,而不是在需要每一个变量时都进行一次数据库查询。它们作为PHP数组进行存储,所以需要对缓存的数据进行序列化从而保存它的结构。任何使用variable_set()和variable_get()作为设置器(setter)和读取器(getter)函数的变量都将以这种方式存储和缓存。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值