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:
set_transient
, get_transient
renvoie nullset_transient
, get_transient
renvoie la première valeurset_transient
, get_transient
renvoie la deuxième valeurDonc, 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?
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' );
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
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!