web-dev-qa-db-fra.com

Pourquoi les transitoires sont-ils éliminés prématurément?

On pourrait penser qu’un ensemble transitoire expirant à une certaine heure existera jusqu’à cette date. Malheureusement, il semble qu'ils disparaissent de la base de données plus tôt, à la fois en test et en production. Comme exemple simple pour voir ce comportement, essayez:

<?php
/*
Plugin Name: Test transient
Description: Show transients bug
Version: 0.1
*/

add_action( 'wp_head', 'doAnAlert' );

function doAnAlert()
{
    if( !get_transient( 'my_messageDismiss' ) )
    {
        //Transient nonexistent or expired
        ?><script> alert("This alert should also show again in 24hr"); </script>
        <?php

        set_transient( 'my_messageDismiss', 'dismissed', 86400); //Set for a day
    }

}

Alors, qu'est-ce qui me manque à propos de l'API Transients? L'alerte indique des heures plus tard, pas un jour plus tard.

7
NoBugs

TL; DR

  • Une partie de Wordpress sur la gestion transitoire est solide, tout est assez précis
  • Les transitoires utilisent le cache d'objets au lieu du magasin de données pour les implémentations autres que celles par défaut
  • Cela signifie que certains systèmes de cache back-end se débarrassent du cache qui n'a pas été consulté récemment
  • En bout de ligne: ce n'est pas une faute de WordPress, cela dépend seulement de la configuration de votre cache back-end

Vous pouvez obtenir des transitoires plus précis, mais cela nécessite des modifications du cache en arrière-plan, ce que je ne recommande pas si vous ne savez pas ce que vous faites, trop de cache pourrait avoir un effet opposé.

Mais même dans ce cas, ne supposez pas que c'est précis à 100%.


De WordPress Codex :

Tout le monde semble mal comprendre le fonctionnement de l'expiration transitoire. Son résumé est donc bref: les délais d'expiration transitoires sont des durées maximales. Il n'y a pas d'âge minimum. Les transitoires peuvent disparaître une seconde après les avoir définies ou 24 heures plus tard, mais ils ne seront jamais là après la date d'expiration.

Vous devriez toujours avoir une méthode de repli.


Pourquoi ça se passe?!

WordPress n’invalide que les passagers lorsqu’ils tentent de les lire (ce qui a déjà entraîné des problèmes de garbage collection). Cependant, ceci n'est pas garanti pour les autres backends.

Les transitoires utilisent le cache d'objets pour des implémentations autres que celles par défaut. La partie vraiment importante à noter ici est que le cache d'objets est un cache, et absolument pas un magasin de données. Cela signifie que l'expiration correspond à un âge maximum et non à un minimum ou à un point de consigne.

Un endroit où cela peut arriver facilement est Memcache réglé en mode LRU (Least Recemment Utilisé). Dans ce mode, Memcache rejettera automatiquement les entrées n’ayant pas été consultées récemment lorsque de nouvelles entrées sont nécessaires. Cela signifie que les données moins fréquemment utilisées (telles que celles utilisées par les données cron) peuvent être supprimées avant leur expiration.

Lire la suite de cet article , il est très bien expliqué.


Mise en cache?

Il existe de nombreux systèmes différents, mais voici un exemple du fonctionnement général de la mise en cache de bases de données MySQL. Je ne sais pas à quel point il est utile de comprendre la mise en cache des transitoires, mais je suppose que cela ne pourrait pas nuire.

  • Les données de chaque requête différente sont mises en cache
  • Chaque donnée en cache reçoit une valeur (requête plus compliquée == valeur plus élevée)
  • Ces valeurs sont décrémentées (comme un compte à rebours si vous voulez)
  • Le système de mise en cache vérifie ces valeurs à intervalles
  • Si l'une de ces valeurs atteint zéro, le cache est détruit.
  • Si la même requête est exécutée à nouveau, la valeur revient à la valeur initiale

Alors .. Que pouvez-vous en conclure? Il n'y a aucun intérêt à définir des transitoires qui sont:

  • Trop simple
  • Pas fréquemment utilisé

Parce que ceux-ci sont détruits très rapidement dans la plupart des cas. J'espère que cela vous donne une idée plus précise du fonctionnement de la mise en cache. Il privilégie les données fréquentes et compliquées par rapport aux données simples et rarement utilisées.

Remarque: Il y a beaucoup de généralisations dans l'explication de cache pour la rendre facile à suivre et à comprendre.

10
N00b