问题描述

在我的插件中,我使用以下代码从数据库中检索一个选项:

$options = get_option('my_plugin_options');

如果我在插件的各种功能中使用这 10 次,WordPress 会对数据库进行 10 次查询,还是仅按 HTTP 请求进行 1 个数据库调用并缓存结果?

最佳解决方案

如有疑问,请查看源代码。

挖掘到 get_option(),你会看到 (缩写):

 $value = wp_cache_get( $option, 'options' );

if ( false === $value ) {
    $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );

    // Has to be get_row instead of get_var because of funkiness with 0, false, null values
    if ( is_object( $row ) ) {
        $value = $row->option_value;
        wp_cache_add( $option, $value, 'options' );
    } else { // option does not exist, so we must cache its non-existence
        $notoptions[$option] = true;
        wp_cache_set( 'notoptions', $notoptions, 'options' );
        return apply_filters( 'default_option_' . $option, $default );
    }
}

首先,WordPress 检查它是否已经在内存中有选项。默认情况下,wp_cache_get()将从 in-memory 数据存储 (通常只是一个 PHP 变量) 中检索值。但一些安装使用更高级的对象缓存,将数据存储在其他位置。

在任一情况下,如果 WordPress 已经知道,wp_cache_get()将返回您的选项值。

如果没有,那么 WordPress 将尝试从数据库中获取它。如果数据库中存在该选项,则 WordPress 会将其缓存在内存中,然后将其重新提供,从而使后续查找更快。

如果该选项不存在于数据库中,那么 WordPress 会在内部的 「这些选项不存在」 数组中标记它,因此它不会尝试稍后查找并返回一些默认值。

所以,回答你原来的问题:

If I use this 10 times in various functions of my plugin, does WordPress make 10 queries to the database, or does it only make 1 database call per HTTP request and cache the results?

WordPress 将根据 HTTP 请求进行 1 个数据库调用,并缓存结果。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。