Функция get_option кэшируется?


13

В своем плагине я использую следующий код для извлечения опции из базы данных:

$options = get_option('my_plugin_options');

Если я использую это 10 раз в различных функциях моего плагина, делает ли WordPress 10 запросов к базе данных, или он делает только 1 вызов базы данных на HTTP-запрос и кэширует результаты?

Ответы:


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 запросов к базе данных, или он делает только 1 вызов базы данных на HTTP-запрос и кэширует результаты?

WordPress будет делать 1 вызов базы данных на HTTP-запрос и кэшировать результаты.


2

Да, это кешируется. Посмотрите на источник функции. Он вызывает wp_load_alloptions()в фоновом режиме, чтобы получить все параметры, и эта функция добавляет результат в кэш:

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

Если вы посмотрите на класс WP_Object_Cachein wp-includes/cache.php, вы увидите, что каждый плагин может вызывать открытый метод flush().

В этом случае значение параметра больше не кэшируется и get_option()будет инициировать новый поиск в базе данных. Плагины не должны этого делать, но чтобы быть уверенным, что вы не затронуты, не вызывайте кеш напрямую, всегда используйте просто get_option().


Кроме того, параметры, которые не загружаются автоматически, будут кэшироваться после первого просмотра. Смотрите мой ответ для полного описания.
EAMann

@EAMann Правильно, я отредактировал это.
fuxia
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.