WordPress原生缓存机制主要有两种:瞬态缓存和对象缓存。两者主要区别是生存时间和存储位置不同,瞬态缓存活在一段时间内,这段时间任何一次页面请求都可以使用,存储在数据库中。对象缓存只生存在一次页面请求中,下一次请求就访问不到了,存储在内存中。但两者也不是界限分明的,当WordPress安装了高级缓存,瞬态缓存可以搬到内存里住,对象缓存也能在多次请求中重复使用。下面来详细介绍一下。
首先明确一下使用场景,与瞬态缓存和对象缓存相对应的是页面缓存,顾名思义,页面缓存会保存整个页面,使得页面请求完全不劳烦数据库。而前两者是部分缓存,例如一个复杂的数据库请求结果,一个从rss feed远程获取的数据, 它们仅仅是页面内容的一部分。
瞬态缓存 / Transients
瞬态缓存类似于WordPress的Options API,也是用wp_options
存储数据,但增加了一个过期时间特性,从而变成临时存储信息的好地方,信息过期后会被清除并重新生成,所以不要用瞬态缓存存储任何不能重新生成的数据。
瞬态缓存由WordPress管理,当你安装了高级缓存插件,例如memcached插件,它会被存储到访问速度更快的内存中。关于瞬态缓存需要注意的有:
- 不要假设它存在,它只能保证过期后一定不存在,但过期前也可以不存在。
- 不要假设它一定存储在数据库里,高级缓存可以改变它的存储位置。
- 有过期时间的瞬态缓存不能像options那样自动加载,没有过期时间的可以自动加载。
- 没有高级缓存时,过期的瞬态缓存仅在用户访问并使用这个缓存时才能被删除,删除后会重新生成,这个过程比较慢的话会影响用户体验。
设置、获取和删除瞬态缓存的方法如下:
set_transient( $key, $value, $expiration )
get_transient( $key )
delete_transient( $key )
$key | 缓存名称,长度要小于172个字符 |
$value | 你要缓存的数据 |
$expiration | 生存时间是多少秒,可以使用预定义的常量: 1分钟 – MINUTE_IN_SECONDS 1小时 – HOUR_IN_SECONDS 1天 – DAY_IN_SECONDS 1星期 – WEEK_IN_SECONDS 1个月 – MONTH_IN_SECONDS 1年 – YEAR_IN_SECONDS |
典型使用方法:
// 判断缓存数据是否存在,存在就获取,不存在就重新生成
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
// 缓存不存在,重新生成
$special_query_results = new WP_Query( 'cat=5&order=random&tag=tech&post_meta_key=thumbnail' );
set_transient( 'special_query_results', $special_query_results, 12 * HOUR_IN_SECONDS );
}
// 使用数据
对象缓存 / Object Cache
对象缓存默认不是持久化的缓存,仅存在与一次http请求中。什么意思呢?比如说一个很复杂的数据库查询结果,你在header使用了一次,又在footer使用了一次,可以用对象缓存防止重复查询。只有开启memcached等高级缓后对象缓存才能持久生存,所以使用前要想明白自己想要的是什么。
对象缓存支持分组,有了分组概念,不同组的缓存key可以重复。
对象缓存的使用方法:
wp_cache_add( $key, $data, $group, $expire )
wp_cache_set( $key, $data, $group, $expire )
wp_cache_get( $key, $group )
wp_cache_delete( $key, $group )
wp_cache_replace( $key, $data, $group, $expire )
wp_cache_flush()
$key | 缓存的key,指定要获取的数据 |
$data | 你要存储到缓存里的数据 |
$group | 组名,让你在不同分组中使用相同的key |
$expire | 生存时间,指定可以存在多少秒,默认0(尽可能长时间的存在) |
wp_cache_add()
和wp_cache_replace()
仅在cache不存在时才会写入数据,而wp_cache_set()
会写入或覆盖数据。
WordPress 2.5之前,在wp-config.php
里写入define('WP_CACHE', true)
可以使对象缓存变为持久缓存,现在仅仅定义常量是不够的,还要安装持久缓存的插件:
查看cache状态:
add_action( 'shutdown', function(){
global $wp_object_cache;
$wp_object_cache->stats();
});
以前Object Cache,现在memcached,还行