WordPress 是如何缓存的?对象缓存(Object Cache)详细介绍和使用!

任何技术要彻底了解它是怎么工作的,则要去了解它的机制和原理,WordPress 优化也是一样,如果要深度理解如何优化 WordPress,那么就要去了解 WordPress 对象缓存的原理和机制。

所以那么今天就来详细讲解一下 WordPress 缓存的底层原理对象缓存(Object Cache),以及在开发的时候如何使用它对 WordPress 进行加速。

WordPress 对象缓存和服务器设置

WordPress 对象缓存(英文名是:Object Cache)就是 WordPress 的缓存机制,它的主要功能是把数据库查询结果或者复杂运算的结果按照 Key-Value 这样的方式存储到对象里面,此外 WordPress 还支持按照 Group 来按组划分,以避免缓存内容的冲突。下次进行同样操作的时候,可以让直接从这个对象中取出数据,不用重复到数据库中或者其他外部获取数据。

WordPress 对象缓存和服务器设置关系很大,如果系统开启了 Memcached 内存缓存,则这个对象是直接存入到内存,在数据未过期之前,以后再次读取这个数据都是直接从内存中读取的,这样效率和速度都非常快的。

如果服务器不支持内存缓存的话,则只能保证在当前页面(PHP同个进程下)下同样的查询或者操作不再重复从数据库中读取了。

WordPress 对象缓存的函数

WordPress 对象缓存技术使用是非常简单的,其核心就是掌握下面下面这四个函数:

  • 添加数据到缓存中:
    wp_cache_add($key, $data, $group='', $expire=0)
  • 设置数据到缓存中:
    wp_cache_set($key, $data, $group='', $expire=0)
  • 获取缓存中的数据:
    wp_cache_get($key, $group='', $force=false, &$found=null)
  • 删除缓存中的数据:
    wp_cache_delete($key, $group='')

这四个函数会涉及到参数我罗列到一起简单讲下,下面知道个大概,可以收藏,方便使用的时候回来查看,重点还是后面的应用:

参数解释
$key数据在缓存中的健名
$data要缓存的数据,获取和删除函数无需用这个参数
$group缓存要添加到的组
$expire过期时间,可选参数,获取和删除函数无需用这个参数
如果是默认缓存,这个参数没用,如果是内存缓存,是设置缓存的时间。
单位是秒,默认为0(0 的意思就是永远,不会自动过期)
$force这个是获取缓存函数独有的函数,设置为 true 则强制使用持久缓存更新本地缓存
$found这个也是获取缓存函数独有的函数,它是一个引用参数,用于存储是否在缓存中找到 key,可以用于消除返回 false 的歧义

使用 WordPress 对象缓存

下面以我以 WordPress 相关文章为例,讲讲如何使用 WordPress 对象缓存。

我们知道 WordPress 相关文章插件是通过 tag 和分类来获取相关文章,文章使用相同的 tag 和分类越多,则认为为相关性越强,这样就需要进行多个表联合查询来获取相关文章,连表查询效率一般是比较差的。比如下面是一个比较通用的从数据库中查找相关文章的函数:

function wpjam_get_related_posts($post_id){
	global $wpdb;

	$term_ids   = wp_get_post_terms($post_id, ['category', 'post_tag'], ['fields' => 'ids']);
	$terms_ids  = implode(',', $term_ids);

	$related_posts = $wpdb->get_results("
		SELECT object_id, COUNT(*) as count
		FROM $wpdb->term_relationships
		WHERE term_taxonomy_id IN ($terms_string) AND object_id != $post_id
		GROUP BY object_id
		ORDER BY count DESC
		LIMIT 10"
	);

	foreach($related_posts as &$post){
		$post = get_post($post->object_id);
	}

	return $related_posts;
}

上面的函数,首先获取文章的标签和分类,然后基于使用相同的标签和分类的数量,通过 SQL 获取相似度最高的 10 篇文章的 ID,然后再相应获取对应的文章(这里为了简化,一般应该要根据文章 ID 批量文章,防止同时多条 SQL 请求)。

但是另外一方面,一篇文章,如果它的标签和分类没有修改的话,那么它的相关文章在一段时间内是不会变动的,所以相关文章的功能就非常适合使用 WordPress 对象缓存进行缓存加速加速。

我们就可以使用 wp_cache_set 函数就是把把相关文章的数据写入缓存的例子,使用当前 post_id 作为 key,related_posts 作为 group,缓存时间为一个小时,即 3600 秒。

$related_posts_data = wpjam_get_related_posts($post->ID);
wp_cache_set($post->ID,$related_posts_data,'related_posts',3600);

把数据存到缓存对象之后,在显示相关文章的时候,就可以使用 wp_cache_get 调用这个对象缓存来使用。

一般的流程是这样的,首先检查下是否已经有相应的缓存,如果你要的信息没有在缓存中,或者已经过期,wp_cache_get() 会返回 false,这时,你就要去数据库中重新获取这些信息,否则就返回在缓存中的信息。

$related_posts_data = wp_cache_get($post->ID,'related_posts');

if(false === $related_posts_data){
	$related_posts_data = wpjam_get_related_posts($post->ID);
	wp_cache_set($post->ID,$related_posts_data,'related_posts',3600);
}

因为设置了一个小时,相关文章的数据就失效,再次显示的时候会重新请求,,如果你在后台更改了设置,需要立即清理缓存,可以通过相关的 Hook 使用 wp_cache_delete 进行清理:

wp_cacache_delete($post->ID,'related_posts');

这里只是简单删除一下,更详细怎么使用 Hook 的例子,可以去 WPJAM Basic 的相关文章扩展中查看详情。

WPJAM 终极方法

通过上面的例子,看到使用 object_cache 都是首先要使用 wp_cache_get 函数去获取,如果不存在,再使用 wp_cache_set 函数去存储,有没有更加方便的方法呢?

有的,WPJAM Basic 提供了一个 wpjam_cache 的方法,可以将这个过程合并了,比如上面的例子,可以通过下面的代码实现:

$related_posts_data = wpjam_cache($post->ID,'related_posts', fn()=> wpjam_get_related_posts($post->ID), 3600);

它有四个参数,前面两个和 wp_cache_get() 函数一样,第三个参数是一个回调函数,它会在对象缓存不存在的时候被调用,获取数据并存到缓存中,从而实现自动实现缓存的过程,第四个是缓存时长。可以说除了第三个参数之外,其他参数和 wp_cache_xxx 函数的参数基本一致,使用也更加简洁,是一种高阶函数的写法。

总结

WordPress 对象缓存(Object Cache)是 WordPress 缓存机制,是深入了解对 WordPress 优化的基础,如果要熟悉 WordPress 开发和应用,都要有掌握好他。此外,WPJAM Basic 集成的 wpjam_cache 函数进一步提高使用效率,只需一步就实现 WordPress 对象缓存。


WPJAM Basic 插件已经集成了 Memcached,下载 WPJAM Basic 之后,将 wpjam-basic/template/ 目录下的 object-cache.php 文件复制到 wp-content 目录下即可。


©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。