Création et lecture de flux RSS 2.0 en PHP

Pierre Ricadat

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. ♪

- Titre : Création et lecture de flux RSS 2.0 en PHP

- Auteur : Pierre Ricadat

- Parution : 1 février 2006

- Mise à jour : 5 février 2006

- Licence : Copyright ® 2006 Pierre Ricadat. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Principe général

- I-A. Objet de l'article

- I-B. RSS 2.0

- I-C. Lier une page

- I-D. Lecteurs de flux

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

- III. Affichage du contenu d'un flux RSS

- III-A. Lecture du fichier XML

- III-B. Affichage des informations

- IV. Améliorations

- V. Téléchargements

I - Principe général

I-A - 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-B - 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.

<?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 chaine d'un format à l'autre.

- Channel : à 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.

<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 représente 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.

<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 commentaires 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-C - Lier une page

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

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

I-D - Lecteurs de flux

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

- Multiplateformes : extension Sage pour Firefox, Lektora ;

- Windows : RSS Xpress, Yoono, Feedreader ;

- Linux : Liferea (Gnome), Akregator (KDE) ;

- Mac : NetNewsWire, Apple Safari.

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 chaine 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.

<?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 cinq dernières news triées par date de la plus récente à la plus vieille.

// 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.

// 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.

// é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 voilà, 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-A - 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.

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 ».

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

III-B - Affichage des informations

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

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 deux scripts selon ses besoins et selon les informations qu'il désire offrir dans son flux RSS. À 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 :

<?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 :

- Le fichier XML ;

- Le fichier PHP + CSS simple pour l'exemple d'affichage.

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