IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    Denis | 邓鸿华发表于 2023-07-26 07:11:37
    love 0

    在 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');
    }
    
    

    © WordPress果酱 / RSS 订阅 / 长期承接 WordPress 项目



沪ICP备19023445号-2号
友情链接