it-swarm.com.de

Probleme mit der Transient API, wenn W3TC aktiviert ist

Ich verwende W3 Total Cache 0.9.2.11 unter Wordpress 3.5.2. Ich habe ein Problem mit der vorübergehenden API und der Objekt-Cache-Einstellung von w3tc.

Wenn ich den Objekt-Cache mit memcached aktiviere (andere Einstellungen sind Standard), funktionieren transiente APIs nicht mehr. Das Verhalten ist: Wenn ich get_transient () innerhalb der Ablaufzeit nach set_transient () aufrufe, erhalte ich null.

Das Verhalten ist konsistent, wenn der Objekt-Cache aktiviert ist, und funktioniert einwandfrei, wenn er deaktiviert ist. In der Dokumentation wurde kein Szenario erwähnt, in dem ein set_transient-Aufruf fehlschlagen könnte.

Ich habe versucht, den Debugging-Modus W3TC-Objekt-Cache. Auf der Seite wurden etwa 1000 bis 2000 Objekt-Cache-Einträge angezeigt. Ich verstehe den Namen jedes Eintrags nicht ganz, aber meine vorübergehenden Werte sind nicht vorhanden.

Ich frage mich, ob ich Einstellungen übersehen habe. Was ist die Ursache dafür?

Update: Ich habe auch bemerkt, dass das Aktualisieren der Seite dazu führt, dass get_transient die gewünschte Ausgabe zurückgibt. Es geht so:

  1. first set_transient, get_transient gibt null zurück
  2. zweiter set_transient, get_transient gibt den ersten Wert zurück
  3. der dritte set_transient, get_transient gibt den zweiten Wert zurück

Es sieht also so aus, als würde der Abschluss von set_transient länger dauern. Gibt es einen Hinweis darauf, ob w3tc diesen Aufruf asynchron gemacht hat? Und wenn ja, wie kann ich das umgehen?

5
He Shiming

Ich hatte das gleiche Problem und konnte es beheben, indem ich Andys Lösung erweiterte. Allerdings musste ich nur den Wert erhöhen, um den Objekt-Cache von W3TC nicht zu verwenden. Ich habe versucht, APC, Memcached sowie Disk für den Cache mit den gleichen Ergebnissen zu verwenden. Zwischenspeichern hilft auf jeden Fall bei der Leistung, und der Code, mit dem ich ein Problem hatte, ist nicht mein eigener (ein Plugin). Daher war es keine Option, ihn inline zu ändern. Geben Sie Filter/Aktionen ein. Ich konnte es mit folgendem Befehl zum Laufen bringen: TRANSIENT_KEY wurde durch den Schlüssel ersetzt, für den Sie das Caching deaktivieren möchten:

global $_wp_using_ext_object_cache_prev;
function disable_linked_in_cached($value=null){
    global $_wp_using_ext_object_cache;
    $_wp_using_ext_object_cache_prev = $_wp_using_ext_object_cache;
    $_wp_using_ext_object_cache = false;
    return $value;
}
add_filter( 'pre_set_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );
add_filter( 'pre_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );
add_action( 'delete_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );

function enable_linked_in_cached($value=null){
    global $_wp_using_ext_object_cache;
    $_wp_using_ext_object_cache = $_wp_using_ext_object_cache_prev;
    return $value;
}
add_action( 'set_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );
add_filter( 'transient_TRANSIENT_KEY', 'enable_linked_in_cached' );
add_action( 'deleted_transient_TRANSIENT_KEY', 'disable_linked_in_cached' );
2
doublesharp

Das derzeit größte Problem beim Cachen von Objekten in W3TC ist zusammen mit einer Lösung: http://wordpress.org/support/topic/self-diagnosed-and-fixed-w3-total-cache-bug-in-faulty -Objekt-Caching

2

Ich bin auf genau dieses Problem gestoßen, und es liegt in der Tat am W3-Cache. Ich habe eine Möglichkeit gefunden, den Objektcache vorübergehend zu deaktivieren, während wir unseren Code ausführen, der für meinen Anwendungsfall funktioniert hat. Der Code sieht folgendermaßen aus:

// We need to turn off the object cache temporarily while we deal with transients,
// as the W3 Total Cache conflicts with our work
global $_wp_using_ext_object_cache;

$_wp_using_ext_object_cache_previous = $_wp_using_ext_object_cache;
$_wp_using_ext_object_cache = false;

// ...do some work with transients here...

$_wp_using_ext_object_cache = $_wp_using_ext_object_cache_previous;

WordPress überprüft den Wert von $_wp_using_ext_object_cache, um festzustellen, ob der Objekt-Cache verwendet werden soll. Daher deaktivieren wir ihn vorübergehend, während wir unsere Arbeit erledigen. Hoffe das hilft jemandem!

1
Andy Adams