Czy funkcja get_option jest buforowana?


13

W mojej wtyczce używam następującego kodu, aby pobrać opcję z bazy danych:

$options = get_option('my_plugin_options');

Jeśli użyję tego 10 razy w różnych funkcjach mojej wtyczki, czy WordPress wykonuje 10 zapytań do bazy danych, czy może wykonuje tylko 1 wywołanie bazy danych na żądanie HTTP i buforuje wyniki?

Odpowiedzi:


25

W razie wątpliwości spójrz na kod źródłowy.

Zagłębiając się get_option(), zobaczysz (w skrócie):

 $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 );
    }
}

Najpierw WordPress sprawdza, czy ma już opcję w pamięci. Domyślnie wp_cache_get()pobierze wartości ze składnicy danych w pamięci (zwykle tylko zmiennej PHP). Ale niektóre instalacje używają bardziej zaawansowanej pamięci podręcznej obiektów, która przechowuje dane w innym miejscu.

W obu przypadkach wp_cache_get()zwróci wartość opcji, jeśli WordPress już ją zna.

Jeśli nie, WordPress spróbuje pobrać go z bazy danych. Jeśli opcja istnieje w bazie danych, WordPress zapisze ją w pamięci podręcznej, a następnie zwróci - przyspieszając kolejne wyszukiwania.

Jeśli opcja nie istnieje w bazie danych, to WordPress oflaguje ją w wewnętrznej tablicy „te opcje nie istnieją”, więc nie próbuje później sprawdzić, a zamiast tego zwraca pewną wartość domyślną.

Tak więc, aby odpowiedzieć na twoje pierwotne pytanie:

Jeśli użyję tego 10 razy w różnych funkcjach mojej wtyczki, czy WordPress wykonuje 10 zapytań do bazy danych, czy może wykonuje tylko 1 wywołanie bazy danych na żądanie HTTP i buforuje wyniki?

WordPress wykona 1 wywołanie bazy danych na każde żądanie HTTP i buforuje wyniki.


2

Tak, jest buforowany. Spójrz na źródło funkcji. Wywołuje wp_load_alloptions()w tle, aby pobrać wszystkie opcje, a ta funkcja dodaje wynik do pamięci podręcznej:

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

Jeśli spojrzeć na klasy WP_Object_Cachew wp-includes/cache.php, widać, że jest to możliwe dla każdego plugin wywołać metodę publiczną flush().

W takim przypadku wartość opcji nie jest już buforowana i get_option()spowoduje ponowne wyszukiwanie bazy danych. Wtyczki nie powinny tego robić, ale aby mieć pewność, że nie ma to wpływu, nie wywołuj pamięci podręcznej bezpośrednio, zawsze używaj tylko get_option().


Ponadto opcje, które nie są ładowane automatycznie, zostaną zapisane w pamięci podręcznej po pierwszym ich wyszukaniu. Zobacz moją odpowiedź dla pełnego opisu.
EAMann

@EAMann Poprawnie, zredagowałem to.
fuxia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.