web-dev-qa-db-fra.com

Les transitoires n'expirent pas comme prévu dans un simple plugin personnalisé

J'ai développé un simple plug-in de shortcode qui extrait essentiellement les fichiers txt de l'URL fournie dans le shortcode et en analyse une donnée spécifique (date à laquelle le fichier a été modifié pour la dernière fois). J'essaie d'utiliser WP transitoires pour mettre en cache les données analysées pendant 24 à 48 heures avant de re-récupérer le fichier txt. Le code que j’ai fonctionne pour le premier appel du fichier, et les données analysées sont stockées dans un transitoire, mais le transitoire ne semble jamais expirer, ce qui permet de récupérer de nouvelles données. Ceci est ma première incursion dans l'utilisation de transitoires, alors je m'excuse si c'est une bêtise qui me manque.

J'utilise le cache d'objets Redis, mais même lorsque je désactive Redis, les transitoires ne semblent pas expirer. Le seul moyen de forcer une mise à jour consiste à modifier la clé de cache redis du site (afin que le cache soit essentiellement vide). Donc, je ne pense pas que le problème réside dans la mise en cache, mais cela pourrait être ...

Le code complet est sur GitHub ici , mais le code approprié (je pense) pour m'aider avec ce bogue est copié ci-dessous.

    // wp shortcode [lastmodified url="url-value"]
    function lastmodified_func( $atts ) {
        $a = shortcode_atts( array(
            'url' => '',
        ), $atts );
        return filemtime_remote( $a['url'] );
    }
    add_shortcode( 'lastmodified', 'lastmodified_func' );

    // check the last modified value of a url
    function filemtime_remote( $url ) {
      $moddate = get_transient( 'mod_' . esc_url( $url ) );
      // if list date is due for refresh and max date refreshes for this page request have not been reached
      if( false === $moddate ) {
        $list = file_get_contents( $url , null , null , 0 , 480 );

        // parsing code omitted on stackexchange for brevity

        // set random transient timeout between 24 and 48 hrs
        $timeout = mt_Rand( DAY_IN_SECONDS , DAY_IN_SECONDS * 2 );
        // set transient for url updated date
        set_transient( 'mod_' . esc_url( $url ), $moddate , $timeout );
      }
      return $moddate;
    }
1
Collin Barrett

Pas clair sur ce qui ne va pas, mais peu de commentaires sur ce que vous faites mal

  1. les transitoires mettent en cache des valeurs jusqu’à un moment, de sorte que votre jeu aléatoire peut en réalité être totalement inutile, en particulier si une URL n’est pas récupérée fréquemment, puisque vous utilisez redis, la valeur peut expirer lors du nettoyage de la mémoire lorsque de nouvelles valeurs doivent y être ajoutées. En d'autres termes, le caractère aléatoire fait déjà partie de l'utilisation d'un transitoire et votre code peut être inutile.

  2. Un nom d'option peut comporter jusqu'à 64 caractères. Cela signifie que pour les longues URL, vous obtiendrez les mêmes valeurs en cache pour les URL qui commencent par les mêmes 64 lettres (en réalité, en raison du préfixe transitoire, encore moins). En réalité, cela pourrait être une limitation de l'implémentation non redis qui sauvegarde le transitoire dans la base de données, mais je voudrais bien le risquer - il suffit d'utiliser md5 ou une autre fonction de hachage au lieu d'échapper à l'URL.

  3. utilisez un préfixe bien meilleur pour vos transitoires, mod est beaucoup trop générique et votre code pourrait coexister avec un autre plugin.

1
Mark Kaplun