< Accueil

Exemple-2

Mettre en cache un flux en lecture

Lorsqu'on syndique sur son site un flux rss d'une autre source, celle-ci pour des raisons diverses peut se trouver indisponible ou lente d'accès. Pour ne pas avoir à recalculer la page de votre site et à faire une requète sur le flux distant à chaque visite de celle-ci, il suffit d'en mettre tout ou partie en cache. Pour cela on génére un fichier contenant le code html résultat de l'analyse du flux distant.

Cette génération peut avoir lieu à intervalles de temps réguliers (l'affichage sur votre site sera plus ou moins en retard sur le contenu du flux sur le site distant) l'intervalle de temps étant défini en rapport avec l'activité du flux syndiqué. Autre solution possible si on peut obtenir la date de modification du flux distant, alors l'affichage sera synchrone avec le contenu du fichier. Dans ce dernier cas une requète (mais faisant transiter un volume restreint d'informations) est toujours nécessaire. Le reste du temps on se contente d'inclure le code généré précédemment.

Le déroulement des opération est en gros :

Si (le fichier n'existe pas en cache ou il est insuffisament rescent) {
parser le flux distant;
générer le fichier en cache;
} // fin si
inclure le fichier en cache;

Le fichier est-il en cache ? file_exists(string filename) permet de le savoir. Son âge est donné par filemtime(string filename) qui retoune la date de sa dernière modification du cache sous forme d'un timestamp (nombre de secondes).

Le flux est-il plus récent que le cache ? De deux choses l'une :
soit le serveur distant retourne l'information Last-Modified pour le fichier de flux, soit il ne la retourne pas. En effet les serveurs ne fournissent cette inforamation que pour les fichiers statiques, il ne la fournissent pas pour les fichiers dynamiques (php en particulier). Dans ce dernier cas, c'est au programmeur de mettre en place le mécanisme fournissant cette information (ce qui n'est pas toujours fait). Si la date de modification est fournie, on pourra alors s'en servir pour savoir si le flux est plus récent que le cache, sinon on se servira d'un délai fixé arbitrairement.

Cette solution présente le gros avantage de ne pas avoir à intervenir sur la configuration serveur (impossible pour un serveur mutualisé) ou à avoir recours à un serveur tiers déclenchant la requète sur un fichier php designé sur votre site (solution du type cron.hiwit.org ou www.webcron.org). C'est la requète elle-même sur la page qui déclenche sa mise à jour ou non.

Pour parser le flux distant la méthode est la même que celle décrite dans le fichier exemple-1.php. Au lieu de faire des échos successifs pour afficher le résultat de l'analyse, on stocke les chaines générées dans une variable unique qui sera ensuite écrite dans un fichier placé au bon endroit.

On a alors le code suivant : voir le fichier "parse_flux-1.php". Note : le code donné dans ce fichier convient aussi bien pour les flux retournant la date de modification que pour ceux qui ne la donnent pas. On pourra bien sûr adapter le script à un cas ou à l'autre.

Dans le fichier où doit s'afficher le flux rss il suffira de faire une inclusion du fichier parse_flux-1.php <?php include 'parse_flux-1.php'; ?> (voir ce fichier ci-joint et prendre soin de créer un dossier "cache" ayant tous les droits en écriture - à adapter suivant hébergeur -).

Repertoire cache "cache/" inexistant !