wake-up-neo.com

get_option () vs get_theme_mod (): Warum ist man langsamer?

Ich benutze get_theme_mod() seit einiger Zeit in verschiedenen Projekten von mir. Ich entschied mich, die Theme Customization API in WordPress v3.4 zu nutzen, sobald sie verfügbar war, da ich der Meinung war, dass sie für meine Kunden ein unverzichtbares Werkzeug ist.

Nach einiger Zeit bemerkte ich, dass sich meine Websites etwas träger anfühlten als gewöhnlich, und insbesondere der Customizer brauchte ziemlich lange, um geladen zu werden. Durch viele Versuche und Irrtümer während meiner Untersuchung habe ich mich entschlossen, die type auszutauschen, wenn ich meine Einstellungen (d. H. $wp_customize->add_setting()) von theme_mod auf option registriert habe.

Nachdem ich dies getan und alle get_theme_mod()-Aufrufe an get_option() ausgetauscht hatte, bemerkte ich eine sehr signifikante Geschwindigkeitssteigerung bei Verwendung des letzteren Setups im Gegensatz zum ersteren auf dem Frontend und insbesondere im Customizer auf dem Backend. Ich habe den WordPress-Kern durchgesehen, um herauszufinden, warum dies der Fall ist, kann aber anscheinend nicht erkennen, was der bestimmte Absturz in diesem Szenario ist.

Alle Erkenntnisse, die die Community in Bezug auf die Leistung von get_option() möglicherweise erheblich schneller als von get_theme_mod() hat, werden sehr geschätzt.

15
ntg2

Die Antwort: Ja, die theme_mod-Funktionen sind langsamer, aber nicht wesentlich, und die Vorteile überwiegen die Unterschiede.

Theme-Mods werden als Optionen gespeichert. Die theme_mod-Funktionen sind also im Wesentlichen Wrapper um die options-Funktionen.

Verstehen Sie zunächst, dass theme_mod-Einstellungen als Array in einer einzelnen Option gespeichert werden, die auf den jeweiligen Themennamen festgelegt ist. Also, wenn ich das mache:

set_theme_mod('aaa',123);
set_theme_mod('bbb',456);

Was ich dann tatsächlich in der Datenbank bekomme, ist eine einzelne Optionszeile mit dem Namen theme_mods_themename, die ein serialisiertes Array mit ('aaa' => 123, 'bbb' => 456) enthält.

Jetzt ist get_theme_mod langsamer, weil tatsächlich zwei get_option-Aufrufe getätigt werden. Zuerst wird der Name des Themas abgerufen. Dann erhält es die Option theme_mods_themename. Genau da ist also ein Geschwindigkeitsverlust von 50%. Der Rest der Arbeit besteht hauptsächlich aus Filtern, da es einen zusätzlichen Filteraufruf gibt. Wenn Sie jedoch nicht über einen Filter verfügen, ist dieser unbedeutend.

Beachten Sie, dass das Optionssystem abgerufene Daten im Objektcache speichert, sodass hier nicht mehrere Datenbankaufrufe ausgeführt werden. Nur die erste Verwendung führt zu einem Datenbank-Treffer.

Der set_theme_mod ist etwas langsamer, da er dieselben zwei get options-Aufrufe ausführt, dann einen weiteren get_option-Aufruf ausführt, um den Themennamen erneut abzurufen, und dann update_option mit dem vollständigen Satz der jetzt geänderten Optionen. Dies führt zu einer Datenbankaktualisierung, und die Tatsache, dass viel mehr Daten gesendet werden, kann in der Tat die Ursache für eine spürbare Verlangsamung sein. Das Aktualisieren einiger Bytes ist schneller als das Aktualisieren einer größeren Zeile. Aber normalerweise nicht so sehr, wie Sie bemerken würden. Es sei denn, Sie haben eine ganze Menge Einstellungen ...

Die Theme-Mod-Funktionen sind sicherlich insgesamt zu optimieren, aber Sie sollten sie trotzdem anstelle von get_option und solchen verwenden, die untergeordnete Themes sind.

Das Problem bei der direkten Verwendung von Optionszeilen besteht darin, dass Sie sie direkt verwenden und bestimmte Schlüsselnamen für Ihre Einstellungen verwenden.

Wenn ich ein Thema mit dem Namen "AAA" habe und ein untergeordnetes Thema mit dem Namen "BBB" für die Verwendung auf einer anderen Website erstelle, verwendet mein Thema "AAA" möglicherweise eine Option mit dem Namen "example". Wenn ich eine Site aktualisiere und meine Option aktualisiere, gilt dieselbe Option jetzt für mein untergeordnetes Thema. Was ist, wenn ich das nicht wollte? Was ist, wenn das untergeordnete Thema andere Optionseinstellungen verwenden soll?

Durch das Einfügen des eigentlichen Themennamens (und nicht eines fest codierten Werts) in den Schlüssel stellen Sie sicher, dass jedes "Thema" auf der Site seine eigenen Einstellungen verwendet. Ich kann hin und her wechseln und die Einstellungen werden nicht zwischen ihnen übertragen, sie bleiben so, wie ich sie eingestellt habe. Einfacher, offensichtlicher, intuitiver.

Und wenn eine zukünftige Kernänderung oder ein Plugin die Funktionsweise von theme_mods ändert, werden Sie automatisch die Vorteile davon erhalten, ohne Änderungen vorzunehmen. Wrapper werden immer langsamer, das ist unvermeidlich, es liegt in der Natur der Wrapper. Trotzdem schreiben Sie immer noch PHP Code, nicht Maschinensprache. Wir verwenden solche Wrapper, um Dinge zu vereinfachen und Funktionen zu trennen. Themen sollten nicht wissen oder kümmern müssen, wie ihre Optionen in der Datenbank gespeichert sind oder wie die Benennung funktioniert. Die theme_mod-Funktionen bieten eine einfachere und sauberere Lösung.

19
Otto

get_theme_mod ist nur ein Wrapper um get_option. In der Theorie funktioniert es langsamer, weil es eine weitere Abstraktionsebene ist, aber in der Praxis sollte der Unterschied nicht groß genug sein, um von einem Menschen bemerkt zu werden.

Tatsächliche Geschwindigkeitsunterschiede können verursacht werden, wenn Sie einen langsamen Code für die theme_mod-Hooks haben.

3
Mark Kaplun

Sie können DIE ZEIT TESTEN von get_option (100 Iterationen) mit diesem Code (in functions.php oder irgendwo anders):

add_action('wp','My_Test');
function My_Test(){
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_option('blogdescription'); }
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_theme_mod('blogdescription'); }
    var_dump(microtime(true));
    exit;
}   




Noch ein Gedanke

Ich weiß nicht, ob es einen Unterschied macht (vielleicht wissen Wordpress-Entwickler es besser), aber ich dachte, wenn eine Website hohen Traffic hat und bei jedem Seitenaufruf Hunderte von Optionen benötigt, was passiert, wenn ich beitrete viele Optionen in einem get_option? so was:

update_option('my_extra_optss',  array(
      'myNAME' => 'George',
      'myAGE'  => 43 ));

dann :

$x = get_option('my_extra_optss');
$x['myNAME'];
$x['myAGE'];
................

wird dies eine Website etwas schneller machen?

1
T.Todua

Könnte dann etwas im Customizer passieren? Ich sehe hier das Gleiche wie das OP.

Ich kann bestätigen, dass mit ca. 30 Optionen die Ladezeit meines Customizers von ca. 3 Sekunden auf ca. 0,5 Sekunden gesunken ist, wenn ich zu get_option über get_theme_mod gewechselt habe.

Wenn ich die Methoden direkt aufrufe, sehe ich einen Unterschied von 2 ms.

test_results ( https://Gist.github.com/anonymous/d98a46d00d52d40e7dec )

Wenn Sie die APIs direkt vergleichen, ist dies möglicherweise nicht erkennbar, aber es muss etwas damit zu tun haben, wie sie im Customizer verwendet werden.

0
VykRevler