WordPress 中如何缓存 SQL 查询和 HTTP 请求结果,一文详解 WordPress Transients 功能

在 WordPress 中,如果进行了一些复杂的 SQL 查询或者耗时的 HTTP 请求,并且在一定条件下结果是不变的,那么最好是把这些操作的结果缓存,这样下次进行同样的 SQL查询和 HTTP 请求的时候,就可以直接从缓存中获取数据,从而可以显著加快网站的速度。

那么在 WordPress 中如何缓存 SQL 查询和 HTTP 请求结果?这个时候就要用到 WordPress 的 Transients 功能。

 WordPress Transients

什么是 Transients

Transients 是“短暂的”或“临时的”意思,那么 WordPress Transients 功能可以理解为临时缓存或者短暂缓存的意思。它是 WordPress 用来缓存一些复杂的 SQL 查询和运算结果的最简单的方法。它给这些需要缓存的数据一个过期时间,并且时间一到就会自动删除。

所以如果你在制作 WordPress 插件的时候,需要存储一些有一定生命周期的数据的时候,Transients API 是最好的选择。

缓存的数据存在哪里

这个取决你的服务器设置,如果你的服务器开启 Memcached,那么缓存的数据就存在 Memcached 的内存中,如果没有开启的话,则存储到 WordPress 数据库的 Options 表中。

Transients 相关函数

上面说到服务器没有开启的时候,数据是存储到 Options 表中的,所以它接口函数和 WordPress 的 Option API (get_option, add_option, update_option, delete_option))基本一样,唯一区别就是 Transients API 有一个过期时间。所以 WordPress Transients API 有类似的以下三个函数:

set_transient() // 保存一个临时数据到缓存中
get_transient() // 从缓存中获取一个临时数据
delete_transient() // 从缓存中删除一个临时数据

如果你使用函数 get_transient 去获取一个临时变量,它已经过期或者不存在,则返回 false。另外 Transients API 不会将数据库的 Options 表充满,因为临时变量一旦过期,下次获取的时候就会自动被删除。

一个应用 Transients 的例子

假设你要获取博客的流量最高的 10 篇文章,这个要设计复杂的 SQL 查询,而流量最高的 10 篇文章一般来说在一段时间(比如:12小时)之内是不会变化的,所以我们可以把这个数据通过 Transients API 先缓存了。代码如下:

function wpjam_get_top_10_posts(){
	$top_10_posts = get_transient('top_10_posts');

	if(false === $top_10_posts){ // 临时变量过期了或者根本就没有创建

		// 通过 SQL 查询获取流量最高的 10 篇文章,
		$top_10_posts = get_most_viewed(10);

		// 把临时变量存到数据库中,时间为 12 个小时
		set_transient('top_10_posts', $top_10_posts, 60*60*12);
	}
	return$top_10_posts;
}

其中 get_most_viewed 是它是用来获取流量最高的文章的函数。

如果由于某种原因某篇流行文章删除,或者新的文章发布了,这个时候可能流量最高的文章都可能发生变化,我们需要使用 delete_transient 函数把这个临时变量删除了。代码如下:


add_action('publish_post', 'wp_top_10_posts_delete', 0);
add_action('delete_post', 'wp_top_10_posts_delete', 0);
functionwp_top_10_posts_delete(){
	delete_transient('top_10_posts');
}


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

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