Retrouvez cet article dans : Linux Pratique 37
Vous êtes sûrement abonné aux flux d'informations générés par vos sites Web préférés et vous trouvez ça vraiment pratique. Pourquoi ne pas proposer alors le même service sur votre propre site ? C'est très simple à réaliser et, de cette façon, les lecteurs intéressés par votre contenu pourront s'abonner à votre flux d'actualités, sans être obligés de visiter votre site à chaque fois. Les applications " toutes faites " comme les CMS et moteurs de blogs intègrent pour la plupart la génération automatique de flux RSS (ou Atom). Mais si vous n'êtes pas dans ce cas, voici la procédure à suivre...
Quel intérêt ?
Une méthode pour informer les internautes de votre mise à jour de contenu est de mettre en place une Newsletter. Mais ceci peut s'avérer très fastidieux : inscription de la part des Internautes, risque de spam pour eux, et de votre côté il vous faudra créer cette fameuse newsletter, veiller à ce que la liste des abonnés soit à jour, effectuer les envois, etc.
C'est pourquoi les flux de syndication sont tout indiqués, car ils simplifient la vie du webmaster et des internautes.
L'autre intérêt d'un flux RSS, c'est que d'autres sites (spécialisés en cela) peuvent le récupérer et afficher les dernières nouvelles de votre site. Ainsi, en cliquant sur ce fil de nouvelles, les lecteurs seront dirigés sur votre site.
Un flux RSS est un simple fichier texte que vous hébergez sur votre site, dans un répertoire de votre choix. Il vous faudra le mettre à jour manuellement ou, cas le plus fréquent, faire en sorte qu'il soit géré de façon dynamique.
Mise à jour manuelle
Un flux RSS s'écrit en langage XML (
Extensible Markup Language). Le XML, standard du W3C, est utilisé principalement pour éditer des données structurées, à l'aide de balises spécifiques.
L'objectif de ce langage est d'ailleurs de faciliter le partage et l'échange de données en séparant le contenu du contenant.
Un fichier XML contient des " éléments ", chacun étant entouré de balises spécifiques. Pour utiliser correctement le langage XML, il faut respecter des règles strictes, à savoir :
- ne pas oublier de déclarer qu'il s'agit d'un document XML au début du document (version utilisée, codage des caractères, etc.) ;
- le document ne doit avoir qu'un seul élément racine, qui contiendra tous les autres éléments ;
- chaque balise ouvrante doit être associée à sa balise fermante (et attention, XML est sensible à la casse des caractères !) ;
- les valeurs des attributs doivent être spécifiées entre guillemets.
Pour + d'infos à ce sujet :
La spécification du W3C :
http://www.w3.org/XML/ [en]
La traduction de la recommandation XML 1.1 :
http://www.yoyodesign.org/doc/w3c/xml11/ [fr]
Présentation, règles et définitions XML :
http://fr.selfhtml.org/xml/ [fr]
La structure de notre fichier va donc être la suivante :
- Au début, on indique qu'il s'agit d'un fichier XML et on précise la version et l'encodage du texte. Il faut ensuite préciser la version de RSS utilisée, puis ouvrir le canal avec la balise <channel>.
- Suivent les informations d'ordre général sur votre site : titre, URL, description, etc. Vous pouvez même préciser la langue utilisée, ajouter une image caractéristique, des informations de copyright, une date de mise à jour, etc.
- Puis, chaque nouvelle est définie entre une paire de balises <item></item>. Vous devez y mettre un titre, le lien vers le contenu complet de la nouvelle (URL en absolu) et une description.
Voici un exemple de flux RSS (les éléments en bleu sont obligatoires) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>Le titre de votre site Web</title>
<link>http://URL_de_votre_site_web</link>
<description>Une description de votre site</description>
<language>fr</language>
<copyright>Peut-être une mention de copyright ici</copyright>
<image>
<title>Le titre descriptif de l'image</title>
<url>http://URL_de_l'image</url>
<link>http://URL_vers_laquelle_pointe_l'image</link>
</image>
<pubdate>Date et heure de publication</pubdate>
<item>
<title>Le titre d'une première nouvelle</title>
<link>http://URL_pointant_vers_la_nouvelle</link>
<pubDate>Date et heure de publication</pubDate>
<description>Une brève description de la nouvelle</description>
</item>
<item>
<title>Et une deuxième nouvelle</title>
<link>http://URL_pointant_vers_la_nouvelle</link>
<pubDate>Date et heure de publication</pubDate>
<description>Une brève description de la nouvelle</description>
</item>
</channel>
</rss> |
Il ne vous reste plus qu'à éditer et enregistrer ce fichier (ex. :
mes_actus.xml), puis à le transférer à la racine de votre serveur Web. Vous pouvez alors ouvrir votre navigateur et saisir l'URL suivante : http://URL_de_votre_site/votre_fichier.xml. Vous devriez observer la même chose que sur la figure 1.
Pour s'abonner à votre flux d'informations, les internautes devront ajouter cette URL à leur agrégateur de flux RSS favori.
Remplir à la main ce type de fichier ne pose aucun souci lorsque les actualités sont peu nombreuses, mais cela peut vite devenir très contraignant si vous devez saisir plus d'une dizaine de nouvelles, et renseigner pour chacune le contenu des balises
<item>,
<title>,
<link> et
<description>. Heureusement, il est possible de générer automatiquement ce type de fichier XML...

Mise à jour automatique
En effet, si vous gérez votre site web à l'aide d'une base de données, il vous suffit de créer un script PHP qui va générer automatiquement votre fichier XML à partir des informations récupérées dans la base de données. Le fichier PHP va, d'une part, interroger la base de données pour vérifier que de nouvelles données ont été ajoutées et, d'autre part, il va mettre en forme ces données en créant le fichier XML.
Création de la base de données
Pour notre exemple, nous allons rapidement créer une base de données fictive, nommée " demorss ", à l'aide de PhpMyAdmin. Cette base comporte une table nommée " articles ". Pour déterminer les champs associés à cette table, il est nécessaire de se référer à la structure du fichier XML. Ainsi, nous créons les champs
author,
title,
pubDate et
description, ainsi qu'un champ
id (essentiel pour différencier les différents items de la base).
La requête SQL effectuée correspond finalement à ce qui suit :
|
|
CREATE TABLE <code>articles</code> (
<code>id</code> TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
<code>author</code> VARCHAR( 255 ) NOT NULL ,
<code>title</code> VARCHAR( 255 ) NOT NULL ,
<code>pubDate</code> VARCHAR( 50 ) NOT NULL ,
<code>description</code> TEXT NOT NULL
) ENGINE = MYISAM ; |
Ensuite, nous saisissons rapidement deux entrées dans cette base (onglet Insérer dans PhpMyAdmin), afin de simuler l'ajout de deux nouveaux articles.
Attention ici au format de la date pour le champ
pubDate ! En effet, de la façon dont votre date est saisie dans votre table MySQL, dépend le formatage de la date dans le fichier PHP (voir plus loin). La fonction
date() retourne une date sous forme d'une chaîne, selon le format spécifié en premier argument (dans notre cas, il s'agit de
r). La date est fournie par le deuxième argument sous la forme d'un timestamp. Pour plus d'informations sur le timestamp unix, je vous invite à consulter la page
http://phpcodeur.net/articles/php/dates De plus, vous pouvez jeter un œil à la description de la fonction
date() dans le manuel PHP en ligne.
Création du fichier PHP
Nous allons créer à présent un fichier PHP, nommé
rss.php, qui va nous permettre de créer le flux RSS. Dans un premier temps, il faut interroger la base de données. Pour cela, nous allons utiliser la librairie
PEAR::DB (pour plus d'informations au sujet des librairies PEAR et de leur utilisation, ainsi que sur l'utilisation détaillée de
PEAR::DB, je vous renvoie au Cahier Web de Linux Pratique n°32). Rappelons simplement que cette librairie, une fois installée, vous permet d'utiliser des fonctions spécifiques permettant de récupérer aisément les données d'une base.
Observez le script commenté suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
<?php
// on appelle la libraire DB
require_once "DB.php";
// connexion à la base puis test de la variable $db
$dsn = "mysql://username:password@localhost/demorss";
$db = DB::connect($dsn);
if (DB::isError($db)) {
die($db->getMessage());
}
// récupération et tri des éléments de la table " articles " + test en cas d'erreur
$result = $db->query("SELECT id, author, title, pubDate, description FROM articles ORDER BY pubDate");
if (DB::isError($result)) {
die($result->getMessage());
}
// instruction conditionnelle : tant qu'il y a des articles, on les affiche à l'écran.
while ($article = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
echo "<pre>";
print_r($article);
echo "</pre>";
}
?> |
Pour le moment, notre script récupère et renvoie correctement les données de notre base. C'est ce que l'on peut vérifier en ouvrant ce fichier dans notre navigateur Web (Fig. 2).

À présent, nous allons faire en sorte que le script utilise les données, non plus pour les afficher telles quelles à l'écran, mais pour générer le fichier XML.
Pour cela, nous allons remplacer l'instruction conditionnelle précédente par la série d'instructions suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
// S'il y a des articles, on génère le flux RSS
if ($result->numRows() != 0) {
// Envoi de l'en-tête du fichier pour signifier au navigateur qu'il s'agit d'un fichier XML.
header("Content-Type: text/xml");
// La variable $xml contiendra le code xml du flux
$xml = '<' . '?xml version="1.0" encoding="ISO-8859-1"?' . '>';
// Traitement du format RSS 2.0
$xml .= '<rss version="2.0">';
$xml .= '<channel>';
$xml .= '<title>Premier flux RSS</title>';
$xml .= '<link>http://www.linux-pratique.com</link>';
$xml .= '<description>Mon premier Flux RSS</description>';
$xml .= '<copyright>Linux Pratique</copyright>';
$xml .= '<managingEditor>Fleur Brosseau</managingEditor>';
$xml .= '<webMaster>FB</webMaster>';
$xml .= '<generator>Mon Script PHP</generator>';
$xml .= '<lastBuildDate>' . date("r") . '</lastBuildDate>';
$xml .= '<ttl>1440</ttl>';
// on retrouve ici une instruction conditionnelle. Pour chaque article le script récupère les valeurs des champs définis dans la base et les inclue dans les balises XML adéquates
while ($article = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
$xml .= '<item>';
$xml .= '<author>' . stripslashes($article["author"]) . '</author>';
$xml .= '<title>' . stripslashes($article["title"]) . '</title>';
$xml .= '<link>http://www.linux-pratique.com/article/' . $article["id"] . '.html</link>';
$xml .= '<pubDate>' . date("r", $article["pubDate"]) . '</pubDate>';
$xml .= '<guid>http://www.linux-pratique.com/article/' . $article["id"] . '.html</guid>';
$xml .= '<description>' . stripslashes($article["description"]) . '</description>';
$xml .= '</item>';
}
$xml .='</channel>';
$xml .= '</rss>';
echo $xml;
}
?> |


Voilà , notre script est terminé. Si vous ouvrez ce fichier dans votre navigateur Web (dans notre exemple, http://localhost/demorss/rss.php), vous obtenez quelque chose de similaire à la figure 3, page précédente.
Notez bien la fonction
header("Content-Type: text/xml"); en début de fichier, dont la présence est essentielle pour que le flux XML soit correctement interprété.
Pour une dernière vérification, vous pouvez tester l'apparence de votre flux RSS dans l'agrégateur de flux de votre choix. Sur la figure 4, vous pouvez observer l'apparence de notre flux avec l'agrégateur Liferea. Constatez que lorsque l'on affiche les propriétés de l'abonnement (Fig. 5), on retrouve les informations saisies dans la partie " traitement du format RSS " du script. Ces informations apparaissent également en grisé dans la zone de visualisation.
Pour terminer, soulignons qu'il est tout à fait possible de faire quelque chose de similaire pour le format Atom, voire de traiter les 2 cas en même temps en ajoutant une instruction de type
switch au script précédent.
Liens
RSS 2.0 – traduction française :
http://www.stervinou.com/projets/rss/ [fr]
Manuel PHP :
http://fr.php.net/manual/fr/ [fr]
Comparaison RSS2.0 et Atom1.0 :
http://www.intertwingly.net/wiki/pie/Rss20AndAtom10Compared [en]