片段缓存增加数据库查询

时间:2015-02-04 作者:akmur

使用下面描述的技术在wordpress站点上实现片段缓存时:http://css-tricks.com/wordpress-fragment-caching-revisited/ 我发现它实际上似乎增加了查询。

我现在已经在页面上缓存了许多片段,并且(在我的本地环境中)在0.764秒内得到294个查询(使用get_num_queries()timer_stop(0)).

我缓存的一个片段是菜单。如果我从中删除片段缓存,我将在0.736秒内得到:292个查询。

如果我在0.862秒内从搜索中删除片段缓存:290个查询。

如果我删除更多查询:在0.783秒内删除287个查询。

那么,这里发生了什么?片段缓存确实在工作,但它是否有积极的影响?另外,使用片段缓存的查询比不使用片段缓存的查询多,这样可以吗?

在里面functions.php 我有:

function fragment_cache($key, $ttl, $function) {
  if ( is_user_logged_in() ) {
    call_user_func($function);
    return;
  }
  $key = apply_filters(\'fragment_cache_prefix\', \'fragment_cache_\').$key;
  $output = get_transient($key);
  if ( empty($output) ) {
    ob_start();
    call_user_func($function);
    $output = ob_get_clean();
    set_transient($key, $output, $ttl);
  }
  echo $output;
}
在我的帖子页面中

<?php fragment_cache(\'text\' . $post->ID, WEEK_IN_SECONDS, function() {  ?>
    <?php the_sub_field(\'text\'); ?>
<?php }); ?>
在我的菜单中:

<?php 
    fragment_cache(\'primary-nav\', YEAR_IN_SECONDS, function() {
        wp_nav_menu( array( \'theme_location\' => \'primary\' ) );
    });
?>

1 个回复
最合适的回答,由SO网友:cybmeta 整理而成

您使用的是瞬态API,它可以在上存储数据wp_options 默认情况下为表。这意味着将执行额外的数据库查询来设置瞬态并获取瞬态。使用您的代码,当瞬态存在且有效时,未登录用户在第二次和后续访问中的查询数量应减少。

如果您使用持久缓存插件(或您自己配置持久缓存),则瞬态API将使用WP_Object_Cache 允许缓存的数据存储在内存中而不是数据库中,因此不会有额外的数据库查询。

Summary: 使用wp\\u缓存函数将缓存的数据存储在内存中,默认情况下不会持久化。另一方面,瞬态API始终是持久的,默认情况下使用数据库。如果配置持久缓存、瞬态API和WP_Object_Cache 返回与瞬态API将使用的结果相同的结果WP_Object_Cache.

结束

相关推荐

Nonces and Cache

很明显,表单提交和AJAX请求,尤其是合理的请求,需要“nonces”来避免某些攻击。然而,随着高速缓存系统的大量使用,很难生成它们并输出新的nonce而不是高速缓存的nonce。为了解决这个问题,我考虑创建一个AJAX函数,返回一个新的nonce,在提交表单之前进行请求。然后,此nonce将作为隐藏字段附加到表单中。你认为这是一种安全的方法吗?返回新nonce的PHP函数:function create_nonce() { return wp_create_nonce(\'my-nonc