get_option函数是否已缓存?


13

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

$options = get_option('my_plugin_options');

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

Answers:


25

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

深入了解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()将从内存中的数据存储中检索值(通常只是一个PHP变量)。但是某些安装使用了更高级的对象缓存,该对象缓存将数据存储在其他位置。

无论哪种情况,wp_cache_get()如果WordPress已经知道,将返回您的选项值。

如果没有,WordPress将尝试从数据库中获取它。如果数据库中存在该选项,则WordPress会将其缓存在内存中,然后将其退还给您-加快了后续查找的速度。

如果该选项在数据库中不存在,则WordPress在内部“这些选项不存在”数组中进行标记,因此它不会在以后尝试查找它,而是返回一些默认值。

因此,回答您的原始问题:

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

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


2

是的,已缓存。查看函数的来源。它wp_load_alloptions()在后台调用以获取所有选项,并且该函数将结果添加到缓存中:

wp_cache_add( 'alloptions', $alloptions, 'options' );

如果你看一下这个类WP_Object_Cachewp-includes/cache.php,你会看到,可以为每个插件调用公共方法flush()

在这种情况下,选项值不再被缓存,并且get_option()将触发新的数据库查找。插件不应该这样做,但是为确保您不受影响,请勿直接调用缓存,请始终使用just get_option()


另外,第一次自动查找后,不会自动加载的选项也会被缓存。请参阅我的答案以获取完整说明。
EAMann

@EAMann正确,我对此进行了编辑。
fuxia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.