Get_option işlevi önbelleğe alınmış mı?


14

Eklentimde, veritabanından bir seçenek almak için aşağıdaki kodu kullanıyorum:

$options = get_option('my_plugin_options');

Bunu 10 kez eklentimin çeşitli işlevlerinde kullanırsam, WordPress veritabanına 10 sorgu yapar mı yoksa her HTTP isteği için yalnızca 1 veritabanı çağrısı yapar ve sonuçları önbelleğe alır mı?

Yanıtlar:


26

Şüphe duyduğunuzda, kaynak koduna bakın.

Adresine girdiğinizde şunu get_option()görürsünüz (kısaltılmış):

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

İlk olarak, WordPress zaten bellekte seçenek olup olmadığını kontrol eder. Varsayılan olarak, wp_cache_get()değerleri bir bellek içi veri deposundan alır (genellikle yalnızca bir PHP değişkeni). Ancak bazı yüklemeler, verileri başka bir yerde saklayan daha gelişmiş bir nesne önbelleği kullanır.

Her iki durumda da, wp_cache_get()WordPress zaten biliyorsa seçenek değerinizi döndürür.

Değilse, WordPress veritabanından tutmaya çalışır. Seçenek DB'de varsa, WordPress bunu bellekte önbelleğe alır ve daha sonra geri verir ve sonraki aramaları daha hızlı hale getirir.

Seçenek veritabanında yoksa, WordPress bunu dahili bir "bu seçenekler yok" dizisinde işaretler, böylece daha sonra aramaya çalışmaz ve bunun yerine bazı varsayılan değerler döndürür.

Orijinal sorunuza cevap vermek için:

Bunu 10 kez eklentimin çeşitli işlevlerinde kullanırsam, WordPress veritabanına 10 sorgu yapar mı yoksa her HTTP isteği için yalnızca 1 veritabanı çağrısı yapar ve sonuçları önbelleğe alır mı?

WordPress her HTTP isteği için 1 veritabanı çağrısı yapar ve sonuçları önbelleğe alır.


2

Evet, önbelleğe alındı. İşlevin kaynağına bakın. wp_load_alloptions()Tüm seçenekleri getirmek için arka planda çağırır ve bu işlev sonucu önbelleğe ekler:

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

Eğer sınıfa bakarsanız WP_Object_Cacheiçinde wp-includes/cache.phpgöreceksiniz, her eklenti kamu yöntemi çağırmak için, bu mümkün flush().

Bu durumda, seçenek değeri önbelleğe alınmaz ve get_option()yeni bir veritabanı araması tetikler. Eklentiler bunu yapmamalıdır, ancak etkilenmediğinizden emin olmak için önbelleği doğrudan aramayın, her zaman sadece kullanın get_option().


Ayrıca, otomatik olarak yüklenmeyen seçenekler, ilk kez baktığınızda önbelleğe alınır. Tam açıklama için cevabıma bakın .
EAMann

@EAMann Doğru, bunu düzenledim.
fuxia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.