web-dev-qa-db-fra.com

Problème avec l'API transitoire lorsque le W3TC est activé

J'utilise W3 Total Cache 0.9.2.11 sur Wordpress 3.5.2. J'ai un problème avec l'API transitoire et le paramètre de cache d'objets de w3tc.

Lorsque j'active le "cache d'objets" avec memcached (les autres paramètres sont ceux par défaut), les API transitoires cessent de fonctionner. Le comportement est le suivant: lorsque j'appelle get_transient () dans le délai d'expiration suivant set_transient (), j'obtiens la valeur null.

Le comportement est cohérent lorsque le 'cache d'objets' est activé et fonctionne parfaitement lorsqu'il est désactivé. La documentation ne mentionnait aucun scénario dans lequel un appel set_transient pouvait échouer.

J'ai essayé le mode de débogage cache d'objets w3tc. Et la page affiche environ 1000 à 2000 entrées de cache d'objets. Je ne comprends pas bien le nom de chaque entrée, mais mes valeurs transitoires ne sont pas là.

Je me demande s'il y a des paramètres que j'ai oubliés? Quelle est la cause de cela?

Mise à jour: J'ai également remarqué que l'actualisation de la page ferait renvoyer get_transient la sortie souhaitée. Ça va comme ça:

  1. premier set_transient, get_transient renvoie null
  2. second set_transient, get_transient renvoie la première valeur
  3. le troisième set_transient, get_transient renvoie la deuxième valeur

Donc, il semblerait que set_transient prenne plus de temps, est-ce que w3tc a rendu cet appel asynchrone? Et si oui, comment puis-je résoudre ce problème?

5
He Shiming

J'avais le même problème et je pouvais le corriger en développant la solution d'Andy. Cependant, je n'avais qu'à forcer sur la valeur, en particulier, pour ne pas utiliser le cache d'objets du W3TC. J'ai essayé d'utiliser APC, Memcached ainsi que Disk pour le cache avec les mêmes résultats. La mise en cache contribue certainement à la performance, et le code avec lequel je rencontrais un problème n’est pas le mien (un plugin), il n’était donc pas possible de le modifier en ligne. Entrez des filtres/actions. J'ai pu le faire fonctionner en utilisant ce qui suit, en remplaçant TRANSIENT_KEY par la clé pour laquelle vous souhaitez désactiver la mise en cache:

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

Voici le plus gros problème avec la mise en cache d'objets dans W3TC actuellement, avec une solution: http://wordpress.org/support/topic/self-diagnosed-and-fixed-w3-total-cache-bug-in-faulty -object-caching

2

J'ai rencontré ce problème exact, et il est en effet dû à W3 Cache. J'ai déduit un moyen de désactiver temporairement le cache d'objets pendant l'exécution de notre code, ce qui a fonctionné pour mon cas d'utilisation. Le code ressemble à ceci:

// 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 vérifie la valeur de $_wp_using_ext_object_cache pour déterminer si le cache d'objets doit être utilisé. Nous le désactivons temporairement pendant que nous travaillons. J'espère que ça aide quelqu'un!

1
Andy Adams