I. Principe général

I-1. Objet de l'article

Un flux RSS ou fil RSS ("RSS Feed" en anglais) est un format de syndication de contenu Web.
C'est un fichier XML dynamique dont votre lecteur RSS affiche le contenu qui est mis à jour en permanence.
Posséder un flux RSS sur votre site permettra aux visiteurs intéressés d'être informés dès qu'il y aura du nouveau.

Le but de cet article est de montrer l'utilisation possible des flux RSS à travers 2 exemples concrets : la création d'un fichier RSS à partir d'une base de données mySQL contenant des news, et l'affichage mis en forme du contenu d'un fichier RSS, cela grâce à PHP.

I-2. RSS 2.0

Je présente ici uniquement les principales composantes d'un fichier RSS 2.0.

  • En-tête : Tous les fichiers RSS doivent être conformes à la spécification XML 1.0. On spécifie également le jeu de caractères à utiliser. Pour un site en français, on utilise généralement ISO-8859-1, qui permet de coder les langues d'Europe occidentale et donc accepte les lettres et accents que nous utilisons. Il existe également ISO-8859-15, qui contient des symboles plus récents dont notamment le signe €. UTF-8 et UTF-16 utilisent le standard Unicode et permettent de représenter des milliers de caractères de toutes sortes de langues, dont bien sur les caractères spécifiques français.
 
Sélectionnez

<?xml version="1.0" encoding="iso-8859-1" ?>
				

Attention : si l'on construit le fichier XML à partir d'une base de données, l'encodage utilisé doit respecter l'encodage de la base (si l'on passe d'une base en ISO à un XML en UTF, les accents vont générer des erreurs). On peut utiliser des fonctions PHP comme utf8_encode() et utf8_decode() pour convertir une chaîne d'un format à l'autre.

  • Channel : A la racine du document RSS, on trouve un élément <rss>, avec un attribut obligatoire "version", qui spécifie la version de RSS à laquelle le document est conforme. Ensuite, on trouve un élément unique <channel>, qui contient des informations à propos du channel (métadonnées) et de ses contenus.
 
Sélectionnez

<rss version="2.0">
	<channel>
		<title>Titre du channel</title> 
		<link>http://www.monsite.com</link>
		<description>Description du channel</description>
 
		items...
 
	</channel>
</rss>
					
Liste de tous les éléments pouvant se trouver dans la balise <channel>
Balise Description
title Titre du channel
link URL du site contenant le channel
description Description du channel
language Langue du channel
copyright Info sur le copyright du channel
managingEditor Mail de la personne responsable du contenu
webMaster Mail du webmaster
pubDate Date de publication
lastBuildDate Date de la dernière publication
category Catégorie à laquelle le channel appartient
generator Programme utilisé pour générer le channel
docs Lien vers la documentation du format utilisé dans le fichier RSS
cloud Permet à un programme de s'enregistrer pour être notifié des modifications de ce channel
ttl Time to live, avant le prochain rafraîchissement
image Image affichée avec le channel
rating note PICS
textInput Ajouter une zone de saisie de texte
skipHours Heures que les agrégateurs peuvent ignorer
skipDays Jours que les agrégateurs peuvent ignorer
  • Items : Un channel peut contenir n'importe quel nombre d'items. Chaque item répresente un article, une news et peut posséder notamment un titre, une description, un lien vers l'article en question et une date de publication.
 
Sélectionnez

<item>
	<title>Titre de la news</title> 
	<link>http://www.monsite.com/news.php?id=3</link> 
	<description>Description de la news</description> 
	<pubDate>Mon, 19 Dec 2005 12:00:00 GMT</pubDate>
</item>
					
Liste de tous les éléments pouvant se trouver dans la balise <item>
Balise Description
title Titre de l'item
link URL de l'item
description Description de l'item
author Mail de l'auteur de l'item
category Catégorie à laquelle l'item appartient
comments Lien vers une page de ccommentaires sur l'item
enclosure Objet media attaché à l'item
guid Texte qui identifie de manière unique cet item
pubDate Date de publication
source Channel auquel l'item appartient

I-3. Lier une page

Pour lier une page à votre flux RSS, il suffit d'ajouter ceci entre les balises <head></head> de votre page :

 
Sélectionnez

<link rel="alternate" type="application/rss+xml" href="http://www.monsite.com/flux.xml" />
				

I-4. Lecteurs de flux

Voici quelques-uns des nombreux lecteurs de flux RSS disponibles :

II. Création d'un flux RSS à partir d'une base de données mySQL

On suppose que les news sont stockées dans une base de données mySQL contenant pour chaque news les champs suivants : titre, lien, description et date.

Tout d'abord on crée une chaîne de caractères qui va contenir le contenu du fichier XML, dans laquelle on écrit la balise d'en-tête, ainsi que les informations sur le channel.

 
Sélectionnez

<?php
 
// édition du début du fichier XML
$xml = '<?xml version="1.0" encoding="iso-8859-1"?><rss version="2.0">';
$xml .= '<channel>'; 
$xml .= '<title>Titre du channel</title>';
$xml .= '<link>http://www.monsite.com</link>';
$xml .= '<description>Description du channel</description>';
			

On se connecte à la base en utilisant les variables $host, $pwd et $base préalablement définies. Puis on sélectionne les 5 dernières news triées par date de la plus récente à la plus vieille.

 
Sélectionnez

// connexion a la base
@mysql_connect($host,$user,$pwd) or die("Connexion impossible");
@mysql_select_db($base) or die("Echec de selection de la base");
 
// selection des 5 dernieres news
$res=mysql_query("SELECT * FROM news ORDER BY date DESC LIMIT, 5");
			

On récupère les valeurs de chacun des champs, puis on les ajoute au contenu du fichier, entourées des balises XML correspondantes.

 
Sélectionnez

// extraction des informations et ajout au contenu
while($tab=mysql_fetch_array($res)){   
	$titre=$tab[titre];
	$lien=$tab[lien];
	$description=$tab[description];
	$date=$tab[date];
	$date2=date("D, d M Y H:i:s", strtotime($date));
 
	$xml .= '<item>';
	$xml .= '<title>'.$titre.'</title>';
	$xml .= '<link>'.$lien.'</link>';
	$xml .= '<pubDate>'.$date2.' GMT</pubDate>'; 
	$xml .= '<description>'.$description.'</description>';
	$xml .= '</item>';	
}
			

Puis on ajoute les balises de fermeture du channel et du RSS. Enfin on ouvre le fichier en écriture et on y copie le contenu de la variable $xml.

 
Sélectionnez

// édition de la fin du fichier XML
$xml .= '</channel>';
$xml .= '</rss>';
 
// écriture dans le fichier
$fp = fopen("flux.xml", 'w+');
fputs($fp, $xml);
fclose($fp);
@mysql_close();
 
?>
			

Et voila, notre flux RSS est créé. On peut par exemple exécuter ce script à chaque fois qu'une news est ajoutée dans la base de données, pour que le flux soit mis à jour en même temps.

III. Affichage du contenu d'un flux RSS

III-1. Lecture du fichier XML

On va créer une fonction qui parcourt le fichier XML à la recherche des objets donnés en paramètre (les composants de chaque item). Cette fonction retourne un tableau contenant les valeurs de ces composants pour chaque item.

 
Sélectionnez

function lit_rss($fichier,$objets) {
 
	// on lit tout le fichier
	if($chaine = @implode("",@file($fichier))) {
 
		// on découpe la chaine obtenue en items
		$tmp = preg_split("/<\/?"."item".">/",$chaine);
 
		// pour chaque item
		for($i=1;$i<sizeof($tmp)-1;$i+=2)
 
			// on lit chaque objet de l'item
			foreach($objets as $objet) {
 
				// on découpe la chaine pour obtenir le contenu de l'objet
				$tmp2 = preg_split("/<\/?".$objet.">/",$tmp[$i]);
 
				// on ajoute le contenu de l'objet au tableau resultat
				$resultat[$i-1][] = @$tmp2[1];
			}
 
		// on retourne le tableau resultat
		return $resultat;
	}
}
				

Ainsi le simple appel ci-dessous renverra un tableau contenant, pour chaque item, les valeurs des champs "title","link","description" et "pubDate".

 
Sélectionnez

$rss = lit_rss("flux.xml",array("title","link","description","pubDate"));
				

III-2. Affichage des informations

On va parcourir le tableau obtenu $rss, et pour chaque item $tab, afficher les informations.

 
Sélectionnez

foreach($rss as $tab) {
  echo '<div class="news_box">
           <div class="news_box_title">'.$tab[0].'</div>
           <div class="news_box_date">posté le '.date("d/m/Y",strtotime($tab[2])).'</div>
           '.$tab[3].' <a href="'.$tab[1].'">Lire tout l\'article</a>
        </div>';
}
				

Visionner le résultat

IV. Améliorations

De nombreuses améliorations sont bien évidemment possibles : on peut ajouter des éléments dans chaque item, changer la CSS ou encore l'affichage des données.
Il convient à chacun d'adapter ces 2 scripts selon ses besoins et selon les informations qu'il désire offrir dans son flux RSS. A noter qu'en PHP5, grâce au module SimpleXML, il suffit de charger le fichier XML et on peut accéder encore plus facilement aux informations (voir http://php.net/simplexml) L'exemple précédent devient beaucoup plus simple :

 
Sélectionnez

<?php 
$rss = simplexml_load_file('flux.xml'); 
foreach ($rss->channel->item as $item) { 
  echo '<div class="news_box">
           <div class="news_box_title">'.$item->title.'</div>
           <div class="news_box_date">posté le '.date("d/m/Y",strtotime($item->pubDate)).'</div>
           '.$item->description.' <a href="'.$item->link.'">Lire tout l\'article</a>
        </div>';
} 
?>
			

V. Téléchargements

Télécharger les fichiers exemples :

Je remercie grandement l'équipe XML et notamment GrandFather pour son aide précieuse. Merci aussi à khayyam90 pour la relecture et les conseils.