Wird die Funktion get_option zwischengespeichert?


13

In meinem Plugin verwende ich den folgenden Code, um eine Option aus der Datenbank abzurufen:

$options = get_option('my_plugin_options');

Wenn ich dies 10 Mal in verschiedenen Funktionen meines Plugins verwende, stellt WordPress 10 Abfragen an die Datenbank oder führt es nur einen Datenbankaufruf pro HTTP-Anfrage durch und speichert die Ergebnisse im Cache?

Antworten:


25

Im Zweifelsfall schauen Sie sich den Quellcode an.

Wenn get_option()Sie sich umsehen, werden Sie sehen (abgekürzt):

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

Zunächst prüft WordPress, ob die Option bereits im Speicher vorhanden ist. Standardmäßig wp_cache_get()werden Werte aus einem speicherinternen Datenspeicher abgerufen (normalerweise nur eine PHP-Variable). Bei einigen Installationen wird jedoch ein erweiterter Objektcache verwendet, in dem die Daten an anderer Stelle gespeichert werden.

In beiden Fällen wp_cache_get()wird Ihr Optionswert zurückgegeben, wenn WordPress ihn bereits kennt.

Wenn nicht, wird WordPress versuchen, es aus der Datenbank zu holen. Wenn die Option in der Datenbank vorhanden ist, wird sie von WordPress im Speicher zwischengespeichert und dann zurückgegeben, wodurch nachfolgende Suchvorgänge beschleunigt werden.

Wenn die Option nicht in der Datenbank vorhanden ist, markiert WordPress sie in einem internen Array "Diese Optionen sind nicht vorhanden", sodass es nicht versucht, sie später nachzuschlagen, und stattdessen einen bestimmten Standardwert zurückgibt.

So beantworten Sie Ihre ursprüngliche Frage:

Wenn ich dies 10 Mal in verschiedenen Funktionen meines Plugins verwende, stellt WordPress 10 Abfragen an die Datenbank oder führt es nur einen Datenbankaufruf pro HTTP-Anfrage durch und speichert die Ergebnisse im Cache?

WordPress ruft pro HTTP-Anfrage 1 Datenbank auf und speichert die Ergebnisse im Cache.


2

Ja, es wird zwischengespeichert. Schauen Sie sich die Quelle der Funktion an. Es ruft wp_load_alloptions()im Hintergrund auf, um alle Optionen abzurufen, und diese Funktion fügt das Ergebnis dem Cache hinzu:

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

Wenn man sich die Klasse aussehen WP_Object_Cachein wp-includes/cache.php, werden Sie sehen, ist es möglich , für jedes Plugin das öffentliche Methode aufzurufen flush().

In diesem Fall wird der Optionswert nicht mehr zwischengespeichert und get_option()löst eine neue Datenbanksuche aus. Plugins sollten dies nicht tun, aber um sicherzugehen, dass Sie nicht betroffen sind, rufen Sie den Cache nicht direkt auf, sondern verwenden Sie immer nur get_option().


Optionen, die nicht automatisch geladen werden, werden nach dem ersten Nachschlagen zwischengespeichert. Siehe meine Antwort für eine vollständige Beschreibung.
EAMann,

@EAMann Richtig, das habe ich herausgeschnitten.
fuxia
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.