Drupal专业开发指南 第15章 缓存是如何工作的

     模块常常需要进行昂贵的数据查询或者调用远程web服务。对于这些耗费资源的操作,不需要每次都重复进行一次,模块可以将它们的数据缓存到Drupal中为缓存保留的数据库表中,或者模块也可以创建一个新的数据库表,并将缓存数据存储在那里。当下次用到这些数据时,通过一个简单的查询就可以快速的将其取回。你将在本章的后面看到,Drupal的缓存后端是可插拔的,所以尽管这里所指的是数据库表,实际的后端也可以采用其它的存储,比如直接使用文件或者一个基于内存的缓存。

     在你的模块中,你可以存储缓存信息的默认数据库表是cache。当缓存信息的数据量不大时,最好使用该表。如果你想为每个节点、菜单、用户缓存信息,那么你将需要为你的模块创建一个它自己专有的缓存表。这样就可以减小Drupal的cache表中的记录数量,以及减少写入冲突,从而提升性能。当要为你的模块创建一个新的缓存表时,该表的数据结构一定要与默认的cache表的结构完全相同,这里只有表的名字不同。为了保持一致性,最好在表的名字前面加上前缀cache_。让我们看一下cache表的数据库结构;参看表格15-1.
 
注意 当为你的模块创建一个新的缓存表时,该表的数据结构一定要与默认的cache表的结构完全相同。
 
表15-1 cache表的模式
字段*          类型           Null       默认值
cid            varchar(255)    NO          —
data            longblob        YES         —
expire        int             NO          0
created         int             NO          0
headers         text            YES         NULL
serialized     smallint        NO          0
*粗体表示主键;斜体表示索引字段
 
       cid列,存储的是主缓存ID,用于快速取回缓存信息。在Drupal核心中使用缓存ID的例子有,对于页面缓存使用的是页面的URL(比如,http://example.com/?q=node/1),对于主题注册表缓存使用的是一个字符串和一个主题名字(例如,theme_registry:garland),或者甚至可以使用规则的字符串(比如, variables表中内容的缓存,其缓存ID设置为了variables)。这里的重点是,对于正被缓存的项目来说,缓存ID必须是一个唯一的标识符。
       data列,存储的是你想要缓存的信息。对于复杂的数据类型比如数组或者对象,需要使用PHP的serialize()函数进行序列化,从而将其数据结构也保存到数据库中。(Drupal自动帮你实现了这一点)。
       expire列,使用下面的3个值中的一个:
 
       CACHE_PERMANENT:该项目永远不会被删除,只有当调用cahe_clear_all()并明确给出持久化项目的缓存ID时,才会被删除。
 
       CACHE_TEMPORARY:这意味着当下一次不带参数的调用cahe_clear_all()时,该项目就会被删除,而没有最小时间限制。标记为CACHE_PERMANENT的项目此时不会被删除。
 
       一个Unix时间戳:指的是该项目的最小存在时间,在这个最小时间内,该项目就不会被删除,当过了这个时间,它就和标记为CACHE_TEMPORARY的项目一样了。
 
       created列,是一个Unix时间戳,指的是缓存条目创建的日期。
       headers列,用来存储HTTP的响应头部,在缓存数据是一个完整的Drupal页面请求时使用。大多数时候,你不使用这一字段,这是因为你要缓存的是页面的一部分而不是整个页面,也就是说要缓存的数据不依赖于头部。记住,尽管如此,你自定义的缓存表的结构仍然需要和默认的cache表的结构完全相同,所以尽管没有用到它,也要保留它。
    serialized列,指的是data列中的数据是否处于序列化的形态。0表示未序列化的数据,1表示序列化的数据。如果数据被序列化,并且serialized列的值为1,那么缓存系统在将数据返回给调用者以前,会对其进行反序列化。对于对象、数组这种类型的数据,在被缓存时,缓存系统能将其自动的序列化并将serialized列设置为1。

老葛的Drupal培训班 Think in Drupal

Drupal版本: