在我的插件中,我使用以下代码从数据库中检索选项:
$options = get_option('my_plugin_options');
如果我在插件的各种功能中使用了10次,WordPress是否会对数据库进行10次查询,还是每个HTTP请求仅进行1次数据库调用并缓存结果?
在我的插件中,我使用以下代码从数据库中检索选项:
$options = get_option('my_plugin_options');
如果我在插件的各种功能中使用了10次,WordPress是否会对数据库进行10次查询,还是每个HTTP请求仅进行1次数据库调用并缓存结果?
Answers:
如有疑问,请查看源代码。
深入了解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次数据库调用并缓存结果。
是的,已缓存。查看函数的来源。它wp_load_alloptions()
在后台调用以获取所有选项,并且该函数将结果添加到缓存中:
wp_cache_add( 'alloptions', $alloptions, 'options' );
如果你看一下这个类WP_Object_Cache
中wp-includes/cache.php
,你会看到,可以为每个插件调用公共方法flush()
。
在这种情况下,选项值不再被缓存,并且get_option()
将触发新的数据库查找。插件不应该这样做,但是为确保您不受影响,请勿直接调用缓存,请始终使用just get_option()
。