web-dev-qa-db-fra.com

La fonction get_option est-elle mise en cache?

Dans mon plugin, j'utilise le code suivant pour récupérer une option de la base de données:

$options = get_option('my_plugin_options');

Si je l'utilise 10 fois dans diverses fonctions de mon plugin, WordPress envoie-t-il 10 requêtes à la base de données ou effectue-t-il seulement 1 appel de base de données par requête HTTP et met en cache les résultats?

12
Ben Miller

En cas de doute, regardez le code source.

En creusant dans get_option(), vous verrez (en abrégé):

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

Tout d'abord, WordPress vérifie s'il dispose déjà de l'option en mémoire. Par défaut, wp_cache_get() récupérera les valeurs d'un magasin de données en mémoire (généralement une variable PHP). Mais certaines installations utilisent un cache d’objets plus avancé qui stocke les données ailleurs.

Dans les deux cas, wp_cache_get() renverra la valeur de votre option si WordPress le sait déjà.

Sinon, WordPress essaiera de le récupérer dans la base de données. Si l'option existe dans la base de données, WordPress la mettra en cache puis la restituera, ce qui accélérera les recherches ultérieures.

Si l'option n'existe pas dans la base de données, WordPress la marque dans un tableau interne "ces options n'existent pas", de sorte qu'elle n'essaie pas de la rechercher ultérieurement et renvoie une valeur par défaut.

Donc, pour répondre à votre question initiale:

Si je l'utilise 10 fois dans diverses fonctions de mon plugin, WordPress envoie-t-il 10 requêtes à la base de données ou effectue-t-il seulement 1 appel de base de données par requête HTTP et met en cache les résultats?

WordPress effectuera 1 appel de base de données par requête HTTP et mettra en cache les résultats.

20
EAMann

Oui, il est mis en cache. Regardez la source de la fonction. Il appelle wp_load_alloptions() en arrière-plan, pour extraire toutes les options, et cette fonction ajoute le résultat au cache:

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

Si vous regardez la classe WP_Object_Cache dans wp-includes/cache.php, vous verrez qu'il est possible que chaque plugin appelle la méthode publique flush().

Dans ce cas, la valeur de l'option n'est plus mise en cache et get_option() déclenchera une nouvelle recherche dans la base de données. Les plugins ne devraient pas faire cela, mais pour être sûr de ne pas être affecté, n'appelez pas le cache directement, utilisez toujours juste get_option().

1
fuxia