这个0sql主题是由上面这个76kb的主题重置成的。添加了
1.分页 跳页功能和 2.文章摘要功能 3.旋转播放器 4.性能统计输出 5.一些加载的优化
移除 Pingback 链接
移除 Block Library CSS
移除 REST API 链接
移除 EditURI (RSD) 链接
移除 WordPress 生成器标签
移除 Feed 订阅功能
0sql使用了以下技术(来自我爱水煮鱼)
WordPress 安装 Memcached 之后,WordPress 的文章页,基本上可以做到 0 SQL 请求,但是首页或者其他列表页总是有两条 SQL 请求,怎么优化呢?
如何缓存 WordPress 主循环
首先在 posts_pre_query filter 基于查询参数 $query_vars 创建缓存的 $cacke_key。
并且使用该 $cache_key 查询一下内存中是否已有相关数据,如有直接返回数据,WordPress 就不会到数据库查询了。
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 就会直接返回。
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 全部放到一个地方,然后文章有更新,一次性把这些 $cache_key 对应的内存缓存清理掉,但是这样子处理发现还更麻烦。
WordPress 中有个 wp_cache_get_last_changed 函数,它使用来存储一类 $cache_group 最后的修改时间,WordPress 文章使用的 $cache_group 是 $posts,每次文章更新删除,或者对应的分类标签修改等等涉及到文章的操作,都会影响该值,WordPress 都会该值设置最新的时间戳。
比如下面这段代码就可以获取 $cache_group 为 $posts 的最后修改时间:
$last_changed = wp_cache_get_last_changed('posts');
如果我们把这个 $last_changed 的值合并到缓存的 $cacke_key 中,这样文章修改了,所有的文章列表的缓存也会快速失效。这样我们就不用担心因为文章修改而造成数据不一致的问题了。
最终 $cache_key 的设置代码改成:
$cache_key = 'md5(maybe_serialize($wp_query->query_vars)).':'.wp_cache_get_last_changed('posts');
说明文档
1.需要开启Memcached 并且把object-cache.php放到wp-content目录下
2.进行页面访问两次 触发memcached 服务器的缓存功能使其缓存到服务器内存。
然后其他第一次访问网站的客户也可以0sql访问页面了。
增加了音乐播放器导致扣分了
删除header.php里面的如下两段代码可以把分数恢复过来
评论抢沙发