it-swarm.com.de

Erklärung von update_post_ (meta/term) _cache

Ich habe einige Best Practices von 10up durchgelesen und sie erwähnen, dass diese beiden Flags in einer WP_Query auf false gesetzt werden (je nachdem, was Sie abfragen):

  • 'update_post_meta_cache' => false: nützlich, wenn Post-Meta nicht verwendet wird.
  • 'update_post_term_cache' => false: nützlich, wenn Taxonomiebegriffe nicht verwendet werden.

Ich bin unter der Annahme es benutzt so etwas wie update_post_caches() , aber ich bin mir nicht 100% sicher, was das bedeutet. Könnte jemand erklären, was diese beiden Flags in einem WP_Query bedeuten und wie nützlich sie sind? Je mehr Informationen, desto besser, da ich nicht viel darüber weiß, wie WordPress die Dinge zwischenspeichert, aber auch eine gut durchdachte Antwort zu diesen beiden Flags akzeptabel ist.

20
Howdy_McGee

Objektcache überall

WordPress versucht, die Anzahl der Datenbankabfragen so weit wie möglich zu reduzieren.

Wenn Sie beispielsweise vor dem Abfragen der Datenbank ein Meta- oder Taxonomiefeld abrufen, prüft WordPress, ob dieses bereits abgefragt und im Cache gespeichert wurde, und gibt es von dort zurück, anstatt die Datenbank abzufragen.

Der "Cache-Job" erfolgt über WP_Object_Cache class und wp_cache_* functions (die Wrapper für diese Klassenmethoden sind).

Wo der Cache lebt

Standardmäßig ist der "Cache" nichts anderes als eine PHP globale Variable. Es bedeutet, dass es sich im Speicher befindet, aber auch, dass es bei jeder Anforderung verschwindet.

Über Dropins (advanced-cache.php und/oder object-cache.php) ist es jedoch möglich, eine benutzerdefinierte Methode zum Behandeln dieses Caches einzurichten.

Normalerweise werden diese Dropins verwendet, um eine Art Caching-Mechanismus einzurichten, der die einzelnen Anforderungen "überlebt".

Aus diesem Grund werden diese Plugins unter WP als "persistent cache" bezeichnet (auch wenn die Wörter "cache" und "persistent" außerhalb der Sprechblase nicht viel Sinn ergeben).

Beliebte Optionen sind heutzutage Memcached oder Redis .

Durch die Verwendung von Plugins für "Persistenten Cache" können Sie die Anzahl der Datenbankabfragen drastisch reduzieren, da der Cache nicht bei jeder Anforderung aktualisiert wird.

Einige Beispiele

$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);

Die beiden obigen Codezeilen lösen maximal eine Datenbankabfrage aus.

Wenn Sie ein benutzerdefiniertes Feld abfragen, werden alle Felder für diesen Beitrag aus der Datenbank abgerufen, über den Objektcache zwischengespeichert und nachfolgende Anforderungen rufen Daten aus dem Cache und nicht aus der Datenbank ab.

Dasselbe gilt für Taxonomiebegriffe. WordPress ruft alle Begriffe für eine Taxonomie einmal ab und gibt sie dann aus dem Cache zurück.

Objekt-Cache wird in WordPress sehr häufig verwendet. Nicht nur für Posts, Metawerte und Taxonomien, sondern auch für Benutzer, Kommentare, Themendaten ...

Was hat WP_Query damit zu tun?

Wenn Sie einige Posts über WP_Query abfragen, zieht WordPress sie standardmäßig nicht nur aus der Datenbank (oder aus dem Cache, wenn sie zwischengespeichert sind), sondern auch aus aktualisiert den Cache für alle benutzerdefinierten Felder und alle Taxonomien in Bezug auf die abgerufenen Posts .

Wenn Sie also beispielsweise get_the_terms() oder get_post_meta() aufrufen, während Sie Posts durchlaufen, die über WP_Query abgerufen wurden, lösen Sie keine Datenbankabfrage aus, sondern rufen Informationen aus dem Cache ab.

Schön, ist es nicht?

Nun ja, aber es ist mit Kosten verbunden.

Das Cache-Update "magic", das WordPress beim Abrufen von Posts über WP_Query ausführt, findet in update_meta_cache für Meta und in update_object_term_cache für Taxonomien statt.

Wenn Sie sich den Quellcode dieser Funktionen ansehen, werden Sie feststellen, dass WordPress in jeder Funktion nur eine Datenbankabfrage durchführt, aber auch viel verarbeitet. Zum Beispiel gibt es in update_object_term_cache7 verschachtelte foreach ... Wenn Sie viele Taxonomien haben und die Anzahl der Beiträge pro Seite hoch ist, ist dies nicht sehr performant.

Über diese WP_Query Argumente schließlich

Was 'update_post_meta_cache' und 'update_post_term_cache' tun, wenn sie auf false gesetzt sind, ist zu verhindern, dass WordPress den Cache für benutzerdefinierte Felder bzw. Taxonomien aktualisiert.

In diesem Fall wird beim ersten Abfragen eines benutzerdefinierten Felds oder einer Taxonomie eine Datenbankabfrage ausgelöst und die Daten werden zwischengespeichert.

Lohnt es sich die Mühe?

Wie üblich lautet die Antwort es kommt darauf an. Meistens ist es eine gute Wahl, diese Werte auf false zu setzen, da unnötige Verarbeitungs- und Datenbankabfragen vermieden werden, wenn sie nicht benötigt werden, und der Cache ohnehin aktualisiert wird, wenn zum ersten Mal benutzerdefinierte Feld-/Taxonomiebegriffe erforderlich sind.

Wenn Sie jedoch get_post_meta() während der Schleife auch nur einmal aufrufen und get_the_terms() für alle (oder die meisten) von Posts unterstützten Taxonomien aufrufen, wird die Cache-Aktualisierung trotzdem ausgelöst und möglicherweise gibt es keine aktuellen Nutzen Sie die Einstellung dieser Abfrageargumente auf false.

28
gmazzap

Das Hauptinteresse hierbei ist die Funktion update_post_caches. Es wird aufgerufen, nachdem WP_Query alle Posts aus der DB erhalten hat. Normalerweise möchten Sie die Posts zunächst anzeigen, was normalerweise bedeutet, dass die Begriffe und etwas basierend auf den Metadaten angezeigt werden. Daher fragt WP_Query standardmäßig die Datenbank nach den Meta- und Termdaten ab, die sich auf die zurückgegebenen Posts beziehen und speichert es den Cache *. Diese Informationen sind in den von WP_Query zurückgegebenen Daten nicht explizit verfügbar. Wenn Sie jedoch die relevanten APIs aufrufen, um die Begriffs- und Metainformationen eines bestimmten Posts abzurufen, sind sie bereits im Speicher verfügbar und es ist nicht erforderlich, eine neue zu senden Abfrage an die DB.

Dies ermöglicht WordPress, den Aufwand für das Senden von Anforderungen an die Datenbank zu reduzieren, indem nur eine Anforderung gesendet wird, um die Informationen für alle Beiträge abzurufen, anstatt eine Anforderung pro Beitrag zu senden.

Im Moment kann ich kein nicht triviales Beispiel dafür finden, wann der Cache nicht aktualisiert werden soll. Ein triviales Beispiel ist es jedoch, wenn Sie nur eine Liste der Titel aller Beiträge wünschen. Dafür benötigen Sie keine Term- oder Metadaten.

* cache - Am wichtigsten ist hier der speicherbasierte Cache, in dem WP fast alles speichert, was er aus der Datenbank erhält, auch wenn kein Objekt-Caching-Plugin aktiv ist. Wenn Sie Objekt-Caching haben, werden die Informationen natürlich auch dort gespeichert.

3
Mark Kaplun