Code-Beispiel: RSS-Feed mit PHP

Falls jemand ebenfalls auf der Suche nach einem selbstgestrickten Feed auf PHP- und mySQL-Basis für einen Apache-Webserver ist, dann lese er oder sie jetzt aufmerksam weiter. Zunächst wird lediglich eine PHP-Datei folgenden Inhalts benötigt:

<?php header("Content-Type: application/rss+xml"); echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>"; ?> <rss version="2.0"> <channel> <title>Toobs Weblog</title> <link>http://tobias-reinhardt.de</link> <description>Toobs Weblog-Einträge als rss-Feed</description> <language>de-de</language> <copyright>Copyright 2006 Tobias Reinhardt</copyright> <image> <url>http://tobias-reinhardt.de/images/logo.jpg</url> <link>http://tobias-reinhardt.de</link> <width>80</width> <height>40</height> <description>Toobs Weblog</description> <title>Toobs Weblogo</title> </image> <?php /* Hier gehört der individuell unterschiedliche Code für die Datenbankabfrage rein, es sollte dabei $rResultset rauskommen. */ while ($aResult = mysql_fetch_array($rResultset)){ ?> <item> <title><?=$aResult['Headline']?></title> <link>http://tobias-reinhardt.de/artikel/<?=$aResult['ID']?></link> <guid>http://tobias-reinhardt.de/artikel-<?=$aResult['ID']?></guid> <description><![CDATA[ <?=nl2br(stripslashes(getBBToHTML($aResult['Text'])))?> ]]></description> <category><?=$aResult['Category']?></category> <pubDate><?=date("D, d M Y H:i:s O", $aResult['DateTime'])?></pubDate> </item> <?php } ?> </channel> </rss>

Diese Datei heißt bei mir rss.php. Zu Beginn wird der Datei-Header jedoch leicht geändert: Die Datei soll an den anfordernden Client (zum Beispiel einen Feed-Reader) als XML-Ressource ausgeliefert werden. Damit das funktioniert, muss die fertige Ressource natürlich auch (ausschließlich) gültiges XML beinhalten. Ab jetzt sollte der RSS-Feed bereits funktionsfähig sein.

Um die Sache etwas abzurunden, sorgen wir noch dafür, dass die eindeutige Adresse des Newsfeeds nicht auf ".php", sondern auf ".xml" endet. Es könnte ebenso auf eine Endung komplett verzichtet werden, da Dateien - und damit auch Dateiendungen - im Kontext von HTTP keine Bedeutung haben. Ich habe mich aber aus nicht mehr nachvollziehbaren Gründen beim Erstellen des Feeds für die ".xml"-Variante entschieden und möchte das heute nicht ändern, solange eine solche Aktion ausschließlich kosmetische Gründe hätte.

Lange Rede, kurzer Sinn: In einer .htaccess-Datei (also einer Datei namens ".htaccess") müssen folgende Zeilen stehen:

RewriteEngine on RewriteBase / RewriteRule ^rss.xml$ rss.php

Das mod_rewrite-Modul des Apache-Webservers muss natürlich aktiviert sein. Hinter RewriteBase wird das Verzeichnis angegeben, indem rss.php liegt (in diesem Fall also das Root-Verzeichnis). Die nachfolgende Regel veranlasst den Webserver dann, die Anfrage nach einer Ressource namens "rss.xml" an eine Datei namens "rss.php" weiterzuleiten. Von außen ist also gar nicht klar, dass es sich um eine PHP-Ressource handelt, da diese später dann ja auch als XML-Datei ausgeliefert wird.

Nachtrag: Umstieg auf Atom-Feed

Meine eigenen Newsfeeds basieren mittlerweile auf dem Atom-Format (der RSS-Feed bleibt aber weiterhin erreichbar). Die Vorgehensweise beim Erstellen eines solchen Feeds ist identisch zur oben geschilderten; es kommen lediglich andere XML-Elemente zum Einsatz.

Letzte Änderung: 23. September 2007