web-dev-qa-db-fra.com

Lieu de stockage transitoire? base de données/cache/w3 Total Cache?

Je travaille pour accélérer mon site en utilisant des transitoires pour stocker le rendu HTML et cela fonctionne très bien. J'ai mis en place des contrôles qui suppriment les transitoires spécifiques lors des mises à jour de publication/page/données et tout fonctionne correctement. J'ai des vérifications complexes de la base de données, donc cela accélère vraiment les choses.

Mais je me heurte à la difficulté de proposer une gestion globale des transitoires. Par exemple, si je modifie les modèles de thème, j'aimerais pouvoir supprimer plusieurs transitoires afin qu'ils soient régénérés automatiquement. Dans quelques cas, je n'ai que cinq transitoires différents, il est donc facile de les parcourir en boucle. Mais dans d'autres extraits, j'ai plus de 100 variantes.

Au niveau de base, les éléments transitoires peuvent être stockés dans la base de données. Ils sont faciles à rechercher et à trouver, même à l'aide de recherches génériques. Cependant, ils ne sont pas toujours stockés dans la base de données. Mais où sont-ils stockés? J'utilise l'opcode cacher de xcache php, mais je ne semble pas les trouver dans la liste des variables xcache. J'utilise aussi W3 Total Cache, mais même avec la mise en cache des objets désactivée (ou le plug-in désactivé), je n'arrive pas à comprendre où ils sont stockés.

Je pense qu'au lieu d'essayer de supprimer chaque transitoire individuellement (ce qui fonctionne toujours bien), j'aimerais pouvoir effectuer des recherches génériques telles que "myprefix_", puis supprimer toutes les correspondances correspondantes. Avec la base de données, je peux le faire ... et il y a beaucoup d'exemples de cela ici. Mais je ne peux pas savoir où sont les transitoires ... s'ils ne sont pas dans la base de données ... et je ne les vois pas dans l'administrateur xcache.

Merci pour toute idée ..

2
johnmontfx

En général, vous ne travaillez pas avec de la mémoire dans le cas de transitoires. Vous travaillez avec l'API transitoire qui utilise la base de données ou le cache d'objets.

Les implémentations de cache d’objets sont arbitraires , elles peuvent utiliser n’importe quel back-end que n'importe qui se soucie de faire fonctionner.

Donc, effectivement, il n'y a aucun moyen de supprimer les transitoires en bloc, car il n'y a pas de suppression en bloc dans le cache d'objets sous-jacent (certains back-ends ne seront tout simplement pas capable d'effectuer une telle opération).

Pour une solution publique, vous devez concevoir votre logique de mise en cache de manière à respecter ces contraintes.

L'une des techniques courantes consiste à inclure une sorte d'identifiant dans les clés transitoires, de sorte que le changement d'identifiant rend effectivement le "vieux" jeu inaccessible. Prenez note des limitations de longueur de clé cependant.

1
Rarst

WordPress stocke les transitoires dans la table d'options de la base de données ou dans l'objet global wp_object_cache, qui nécessite un backend clé-valeur (merci à Rarst pour cette clarification) Il détecte d'abord si un objet de cache est présent et s'il l'utilise. Si un objet de cache n'est pas présent, il retourne à la base de données.

Sans savoir si est activé, nous ne savons pas où WordPress stockera les transitoires. Dans de nombreux cas, cela n'a pas d'importance, mais cela peut être difficile si vous voulez obtenir tous les transitoires avec un préfixe, comme vous le faites. Si vous saviez que les transitoires étaient stockés dans la base de données, il serait simple de créer une requête SQL pour obtenir les transitoires. Le problème est avec l'objet cache.

Une solution serait de stocker tous vos transitoires de thème/plug-in dans un tableau. Vous utiliseriez ensuite l'API transitoires de WordPress pour stocker les valeurs dans la base de données ou dans le cache d'objets.

Classe d'emballage

/**
 * Class to store all theme/plugin transients as an array in one WordPress transient
 **/
class wpse_174330_transient {
  protected $name;
  protected $transient;

  public function __construct( $name ){
    $this->name;
    $this->transient = ( false !== ( $t = get_transient( $name ) ) ) ? $t : [];
  }
  public function all(){
    return $this->transient;
  }
  public function flush(){
    $this->transient = [];
    delete_transient( $this->name );
  }
  public function set( $transient, $value, $expiration = '' ){
    $this->transient[ $transient ] = $value;
    $this->update();
  }
  public function get( $transient ){
    return isset( $this->transient[ $transient ] ) ?
      $this->transient[ $transient ] : false;
  }
  public function delete( $transient ){
    unset( $this->transient[ $transient ] );
    return $this>update();
  }
  protected function update(){
    return set_transient( $this->name, $this->transient );
  }
}

Usage

$theme_transients = new wpse_174330_transient( 'wpse_174330' );
$theme_transients->set( 'header_color', 'blue' );
$theme_transients->get( 'footer_color' );

//* Delete all the transients
foreach( $theme_transients->all() as $name => $value ){
  $theme_transients->delete( $name );
}

//* Flush 'em
$theme_transients->flush();
0
Nathan Johnson