Utiliser les variables persistantes pour mettre en cache une remontée RSS

Il n'est pas rare de trouver sur les sites satellites d'une entreprise un bloc qui remonte les informations à la une du site mère ou d'un site connexe. Pourtant interroger un site distant pour obtenir un flux RSS ou ATOM n'est pas anodin et peut sérieusement impacter le temps nécessaire à la génération d'une page. Pour remédier à cela on enregistre généralement le bloc dans un cache que l'on met à jour à intervalle donnée.

Cet article vous propose de découvrir comment mettre en place un tel fonctionnement en utilisant les variables persistantes du framework ICanBoogie. Nous verrons comment utiliser ces variables et notamment comment leur associer une durée de vie, très utile pour le rafraichissement périodique dont nous avons besoin.

Les variables persistantes

Les variables persistantes sont stockées dans des fichiers sur le serveur. On peut donc les utiliser sans pour autant devoir mettre en place une base de données. Il faudra cependant veiller à ce que l'on ait un droit d'écriture sur le dossier où les variables sont enregistrées.

Les variables persistantes sont gérées par l'accesseur $core->vars. On l'utilise à la manière d'un tableau associatif pour lire, écrire ou supprimer les variables :

<?php

$core->vars['my_var'] = 12;
echo $core->vars['my_var']// 12
echo $core->vars['undefined_variable']// null
unset($core->vars['my_var'])// supprime la variable
isset($core->vars['my_var'])// vérifie si la variable existe

Il est possible de stocker des valeurs complexes telles que des tableaux ou des objets, elles seront automatiquement sérialisées/dé-sérialisées.

Durée de vie

La méthode store() permet de stocker une variable en lui associant une durée de vie :

<?php

$core->vars->store('my_var'123600)// stocke la variable pour 1H (3600 secondes)

Passé cette durée de vie le code $core->vars['my_var'] renverra null si la variable n'a pas été rafraichie.

Exemple de code

Voici à quoi pourrait ressembler la fonction de création d'un bloc RSS ou ATOM qui utiliserait les fonctionnalités de l'accesseur vars.

<?php

namespace Website;

class Hooks
{
    public static function markup_blocks_rss(array $args$engine$template)
    {
        global $core;

        $rendered = $core->vars['cached_rendered_feed'];

        if ($rendered)
        {
            return $rendered;
        }

        $xml = file_get_contents('https://github.com/ICanBoogie/ICanBoogie/commits/master.atom');
        $xml = simplexml_load_string($xml);
        $items = array();
        $source = isset($xml->entry) ? $xml->entry : $xml->channel->item;

        foreach ($source as $item)
        {
            $items[] = array
            (
                'title' => (string) $item->title,
                'url' => (string) $item->link,
                'date' => strtotime((string) $item->pubDate)
            );
        }

        $items = array_slice($items05);
        $rendered = $engine($template$items);

        $core->vars->store('cached_rendered_feed'$rendered3600);

        return $rendered;
    }
}

Fonctionnalités supplémentaires

L'accesseur vars peut être traversé par la construction foreach :

<?php

foreach ($core->vars as $pathname => $iterator)
{
    echo "variable: $pathname<br />";
}

La méthode mathing() permet de créer un itérateur sur les variables correspondant à une expression rationnelle :

<?php

foreach ($core->vars->matching('#^cached_#') as $pathname => $iterator)
{
    echo "match: $pathname<br />";
}

L'itérateur peut être utilisé pour supprimer les variables correspondant à une expression rationnelle :

<?php

$core->vars->matching('#^cached_#')->delete();

Conclusion

Les variables persistantes sont un moyen simple de stoker des valeurs qui ne nécessitent aucune méta-donnée. La durée de vie optionnelle est pratique pour des valeurs qui doivent être rafraichies périodiquement. Un système simple pour conditions simples. Cependant, lorsqu'il s'agira d'enregistrer des valeurs relatives à un site ou un utilisateur on préfèrera recourir à d'autres méthodes.

Laisser un commentaire

Pas de commentaire