La funzione get_option è memorizzata nella cache?


13

Nel mio plugin, utilizzo il seguente codice per recuperare un'opzione dal database:

$options = get_option('my_plugin_options');

Se lo utilizzo 10 volte in varie funzioni del mio plug-in, WordPress effettua 10 query nel database o effettua solo 1 chiamata al database per richiesta HTTP e memorizza nella cache i risultati?

Risposte:


25

In caso di dubbi, guarda il codice sorgente.

Scavando in get_option(), vedrai (abbreviato):

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

Innanzitutto, WordPress controlla se ha già l'opzione in memoria. Per impostazione predefinita, wp_cache_get()recupererà i valori da un archivio di dati in memoria (di solito solo una variabile PHP). Ma alcune installazioni utilizzano una cache di oggetti più avanzata che archivia i dati altrove.

In entrambi i casi, wp_cache_get()restituirà il valore dell'opzione se WordPress lo sa già.

Altrimenti, WordPress proverà a catturarlo dal database. Se l'opzione esiste nel DB, WordPress la memorizzerà nella cache e la restituirà, rendendo più veloci le ricerche successive.

Se l'opzione non esiste nel database, WordPress la contrassegna in un array interno "queste opzioni non esistono", quindi non cerca di cercarla in seguito e restituisce invece un valore predefinito.

Quindi, per rispondere alla tua domanda originale:

Se lo utilizzo 10 volte in varie funzioni del mio plug-in, WordPress effettua 10 query nel database o effettua solo 1 chiamata al database per richiesta HTTP e memorizza nella cache i risultati?

WordPress effettuerà 1 chiamata al database per richiesta HTTP e memorizzerà nella cache i risultati.


2

Sì, è memorizzato nella cache. Guarda l'origine della funzione. Chiama wp_load_alloptions()in background per recuperare tutte le opzioni e quella funzione aggiunge il risultato alla cache:

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

Se guardi la classe WP_Object_Cachein wp-includes/cache.php, vedrai, è possibile per ogni plugin chiamare il metodo pubblico flush().

In questo caso il valore dell'opzione non viene più memorizzato nella cache e get_option()attiverà una nuova ricerca nel database. I plugin non dovrebbero farlo, ma per essere sicuri di non essere interessati, non chiamare direttamente la cache, usare sempre solo get_option().


Inoltre, le opzioni che non vengono caricate automaticamente verranno memorizzate nella cache dopo la prima ricerca. Vedi la mia risposta per una descrizione completa.
EAMann,

@EAMann Corretto, l'ho modificato.
fuxia
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.