web-dev-qa-db-fra.com

Comment effacer et mettre en cache périodiquement les chaînes de fichiers txt distants. - Mon premier plugin

Je maintiens un site Web de ressources, FilterLists , qui est essentiellement un répertoire de fichiers txt hébergés sur le réseau. J'essaie de construire mon premier plugin WordPress pour (a) apprendre et (b) ajouter une nouvelle fonctionnalité à cet outil.

J'essaie de gratter la dernière heure modifiée de chacun des fichiers txt liés (comme indiqué dans le texte actuel par les auteurs). Dans l'état actuel des choses, mon premier passage au plugin fonctionne correctement, mais effectue toutes les opérations de grattage et d'analyse au moment où un visiteur (ou, dans mon cas, le CDN toutes les quelques heures) demande le site, ce qui prend beaucoup de temps à faire. pour tous les fichiers listés. Idéalement, j'aimerais envoyer périodiquement des ping à chacun des fichiers à intervalles réguliers, en utilisant probablement quelque chose comme wp-cron (que je ne connais pas en dehors du fait de savoir qu'il existe) et en mettant en cache les résultats. Si je peux obtenir toutes les dates de la dernière modification mises à jour une fois par jour environ, cela suffira.

Voici le plugin jusqu'à présent, et vous pouvez le voir fonctionner en direct sur les 5 premiers liens txt du site FilterLists lié ci-dessus.

Quelqu'un peut-il m'indiquer la bonne direction pour que [wp-cron] puisse gratter les dates périodiquement plutôt qu'au moment de la demande de page?

Le développement de PHP et de WP est relativement nouveau, la verbosité est donc la bienvenue.

Merci.

1
Collin Barrett

L'API transitoire peut vous aider. Un transitoire est une variable stockée pendant une durée définie.

function filemtime_remote( $url )
{
    $list = file_get_contents( $url , null , null , 0 , 200);
    $important = explode("Last modified: ",$list)[1];
    $mydate = substr($important, 0, 21);
    return $mydate;
}

Ce qui précède est votre code actuel qui recherche le temps "Dernière modification" chaque fois qu'une page est chargée.

Vous pouvez le convertir en:

function filemtime_remote( $url ){   
        # Get the transient
        $mydate = get_transient( 'lm_' . esc_url( $url ) );

        if( false === $mydate ) {
            # The transient expired or does not exist, so we fetch the last modified again
            $list = file_get_contents( $url , null , null , 0 , 200);
            $important = explode("Last modified: ",$list)[1];
            $mydate = substr($important, 0, 21);

            # We then save that date in a transient(which we can prefix with something like "lm_")
            # We are saving the transient for 12 hours
            set_transient( 'lm_' . esc_url( $url ), $mydate , 12 * HOUR_IN_SECONDS );
        }

        return $mydate;
    }

Je ne l'ai pas essayée, mais la logique est la suivante: utilisez get_transient() pour voir si nous avons une valeur enregistrée avec les 12 dernières heures. Si nous avons une valeur (la valeur renvoyée ne sera pas FALSE), utilisez cette valeur. Si nous n’avons pas de valeur (la valeur renvoyée sera FALSE), demandez les données, puis enregistrez-les dans un fichier transitoire, en utilisant set_transient() , qui expirera dans 12 heures.

1
RRikesh