问题描述
在我的插件中,我使用以下代码从数据库中检索一个选项:
$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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。