GET_OPTION函数是否已缓存?

时间:2013-06-10 作者:Ben Miller - Remember Monica

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

$options = get_option(\'my_plugin_options\');
如果我在插件的各种功能中使用了10次,WordPress是对数据库进行10次查询,还是每个HTTP请求只进行1次数据库调用并缓存结果?

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

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

挖掘到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将尝试从数据库中获取它。如果DB中存在该选项,WordPress会将其缓存在内存中,然后将其返回,从而加快后续的查找速度。

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

因此,要回答您最初的问题:

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

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

SO网友:fuxia

是的,它是缓存的。查看函数的源代码。它调用wp_load_alloptions() 在后台,要获取所有选项,该函数会将结果添加到缓存中:

wp_cache_add( \'alloptions\', $alloptions, \'options\' );
如果你看看这个班WP_Object_Cache 在里面wp-includes/cache.php, 您将看到,每个插件都可以调用public方法flush().

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

结束

相关推荐

注意:未定义的索引:在Options-Framework.php中

我在选项框架中生成以下通知。php。注意:未定义索引:在选项框架中。php我认为这与卫生处理有关,但不知道如何解决这个问题。我在选项中定义了以下数组。php// Pull all the custom taxonomies into an array $options_password_taxonomies = array(); $taxonomies_password_terms_obj = get_terms(\'password_gallery_category\'); fo