前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用内存缓存优化 WordPress 主循环,实现首页 0 SQL

使用内存缓存优化 WordPress 主循环,实现首页 0 SQL

作者头像
Denis
发布2023-04-14 08:54:43
1.3K0
发布2023-04-14 08:54:43
举报
文章被收录于专栏:WordPress果酱WordPress果酱

WordPress 安装 Memcached 之后,WordPress 的文章页,基本上可以做到 0 SQL 请求,但是首页或者其他列表页总是有两条 SQL 请求,怎么优化呢?

如何缓存 WordPress 主循环

首先在 posts_pre_query filter 基于查询参数 query_vars 创建缓存的 cacke_key。

并且使用该 $cache_key 查询一下内存中是否已有相关数据,如有直接返回数据,WordPress 就不会到数据库查询了。

代码语言:javascript
复制
add_filter('posts_pre_query', function ($pre, $wp_query){
	if(!$wp_query->is_main_query()){	// 只缓存主循环
		return $pre;
	}

	$cache_key	= md5(maybe_serialize($wp_query->query_vars));

	$wp_query->set('cache_key', $cache_key);

	$post_ids	= wp_cache_get($cache_key, 'wpjam_post_ids');

	if($post_ids === false){
		return $pre;
	}

	return wpjam_get_posts($post_ids);
}, 10, 2);

如果前面在内存中没有相关缓存,这个时候 WordPress 已经到数据库查询出相关的结果了,使用 posts_results filter 把 WordPress 主循环的结果缓存到 memcached。

这样下次 WordPress 在此查询相同的数据的时候,在 posts_pre_query filter 就会直接返回。

代码语言:javascript
复制
add_filter('posts_results',	 function ($posts, $wp_query) {
	$cache_key	= $wp_query->get('cache_key');

	if($cache_key){
		$post_ids	= wp_cache_get($cache_key, 'wpjam_post_ids');
		if($post_ids === false){
			wp_cache_set($cache_key, array_column($posts, 'ID'), 'wpjam_post_ids', DAY_IN_SECONDS);
		}
	}

	return $posts;
}, 10, 2);

如何更新缓存

这样缓存之后,最大的问题是文章修改怎么更新缓存呢?因为每次不同查询的 cache_key 都是不同,且和文章没有任何相关性。期间考虑过把这类的 cache_key 全部放到一个地方,然后文章有更新,一次性把这些

WordPress 中有个 wp_cache_get_last_changed 函数,它使用来存储一类 cache_group 最后的修改时间,WordPress 文章使用的 cache_group 是

比如下面这段代码就可以获取 cache_group 为 posts 的最后修改时间:

代码语言:javascript
复制
$last_changed = wp_cache_get_last_changed('posts');

如果我们把这个 last_changed 的值合并到缓存的 cacke_key 中,这样文章修改了,所有的文章列表的缓存也会快速失效。这样我们就不用担心因为文章修改而造成数据不一致的问题了。

最终 $cache_key 的设置代码改成:

代码语言:javascript
复制
$cache_key = 'md5(maybe_serialize($wp_query->query_vars)).':'.wp_cache_get_last_changed('posts');

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何缓存 WordPress 主循环
  • 如何更新缓存
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档