Drupal 7 cache/缓存入门指南

使用Drupal构建复杂而动态的内容是件很容易的事情。可是稍有不慎,你会为这种容易付出代价。在用户查看某些复杂而动态的页面的时候,复杂的数据库查询,与高花销的计算会致使页面性能方面的问题。 php

解决方案之一是在Druapl的后台页面开启页面缓存。页面缓存开启后,能够在某些页面极大的下降数据库查询次数从而提升页面性能。可是这有必定的局限性,就是页面缓存仅仅对匿名用户有效。对应登陆用户则会生效。 数据库

逐渐的,你可能会分析本身写过的代码,找出数据出查询的热点进行缓存优化。幸运的是,Drupal已经内置了一些缓存API,若是遵循下面的一些规则,能够将你的代码优化工做变得更容易。 缓存

基本规则: 服务器

规则:若是计算结果能够重用或存储,就不要计算两次。 函数

下面的简单例子用来演示这种状况。 性能

1
2
3
4
5
6
7
function my_module_function() {
  $my_data = &drupal_static(__FUNCTION__);
  if (!isset($my_data)) {
    //将一些高花销的计算逻辑写在这里,并将结果赋值给$my_data变量。
  }
  return $my_data;
}

理解上面的的代码,须要必定的php基础知识。 优化

首先是知道php有个变量类型是静态变量(static)。drupal_static函数其实就是实现static变量的集中管理。 spa

其次是函数前加"&"符号,这种是按址传值。这样的话,对$my_data变量的任何更改,对&drupal_static(__FUNCTION__)都会相应更改。 unix

这两点理解后再来看上面的逻辑,发现虽然只有一个if判断,但其实这段代码是精妙无比的。 orm

进阶:善用Drupal的cache函数。

在上面的代码中,静态变量的数据只会在一次的页面加载过程当中有效。若是从新访问该页面,则会从新进行数据的计算。就是说静态变量缓存的数据只是暂时的,没有长久的存储起来。下面的代码,演示如何将复杂的计算结果的数据存储到drupal的cache表中,从而实现长久存储的目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function my_module_function() {
  $my_data = &drupal_static(__FUNCTION__);
  if (!isset($my_data)) {
    if ($cache = cache_get('my_module_data')) {
      $my_data = $cache->data;
    }
    else {
      //将一些高花销的计算逻辑写在这里,并将结果赋值给$my_data变量。
      //这里将计算的结果保存到cache表中。
      cache_set('my_module_data', $my_data, 'cache');
    }
  }
  return $my_data;
}

上面的例子,结合了cache_set与cache_get,对计算出的结果数据缓存到Drupal的cache表中;在第一次执行的时候,须要复杂计算;可是第二次执行这段代码的时候,数据内容会直接从cache表中读取,从而避免复杂的计算开销或数据库查询,有一次提高代码执行的效率。

缓存数据更新

若是使用cache_set()方式设置的cache数据过时了怎么办?默认状况下,cache_set设置的缓存会一直存储在数据库中,直到你调用cache_clear_all()函数进行强制清空缓存(若是安装了admin_menu模块,使用admin menu提供的清空缓存功能也能够清除cache表的缓存)。

若是你的数据是比较零散的更新,能够在每次数据更新的时候,调用cache_clear_all('my_module_data', 'cache')进行缓存数据的更新。若是是存储的一些有规律的数据片断,能够经过以下方式使用通配符的方式进行清空缓存。

1
cache_clear_all('my_module', 'cache', TRUE);

这种方式会清空全部以my_module为开头的缓存。

若是你的缓存的过时时间是有规律的,能够预测的,能够尝试使用下面方式来给缓存设置过时时间。

1
cache_set('my_module_data', $my_data, 'cache', time() + 3600);

最后一个参数是unix时间戳,表示是缓存的过时时间。在这个例子中,缓存在设置的一个小时后过时,缓存中的数据自动被丢弃。

定制本身的缓存表

在上面的代码展现过程当中,若是你细心,你会发现cache_set()函数的第三个参数"cache",这个实际上是表明cache的数据表的名字。若是你须要使用大量的缓存,最好可使用一个独立的数据表来存数缓存数据;这样有利于加速数据查询的速度。大名鼎鼎的views模块就使用了这种技术来实现其缓存控制策略。

最简单,最Drupal化的定制自定义缓存表的方式,是在模块的install文件里执行hook_schema().如下是例子:

1
2
3
4
function mymodule_schema() {
  $schema['cache_mymodule'] = drupal_get_schema_unprocessed('system', 'cache');
  return $schema;
}

上面的函数中的drupal_get_schema_unprocessed('system', 'cache')用来获取Drupal默认的cache表结构的定义供cache_mymodule表使用。

若是你想完全压榨服务器的性能,只要在settings.php文件里添加少许代码,就可让Drupal cache_set,cache_get等函数调用的cache系统用其余的缓存系统来替换。好比广受欢迎的memcache(基于内存的缓存,效率极高),APC(基于文件的缓存)等。只要使用标准的Drupal cache函数,即便更改了缓存系统,也不须要修改你的代码。

一些注意点:

1:切勿为了缓存而缓存。好比从数据库查询一条结果,将一条结果写入数据库,这些都是很轻的操做,不必使用缓存。推荐使用devel模块来查找代码方面性能瓶颈并进行针对性的优化。

2:缓存表存数的数据都是blob类型的,切勿作与cache表的join查询。

3:切记缓存中的数据不是永久存储的。任何调用cache_clear_all的代码都会清空缓存。所以没法经过重复计算获取的数据,切勿存储到缓存表。

向前冲吧,风骚的Drupalor们!

如今,若是你认真读完此文并消化吸取,那么恭喜你:你掌握了一把加速你代码的利器!继续前进,继续优化!

相关文章
相关标签/搜索