joerghuelsermann.de Really Simple Syndication Feed

Really Simple Syndication Feed

Ich möchte auf dieser Seite mal erläutern wie mein RSS Feed entstanden ist. Obwohl ich kein vorgefertigtes CMS auf dieser Domain einsetze denke ich schon das man einen solchen RSS Feed einsetzen sollte.

Im Prinzip sollte jede Webseite nach dieser Anleitung im Stande sein einen RSS Feed zu veröffentlichen.

Funktionsprüfung

Um die Funktion meiner Datenbank etwas plastischer darzustellen ist einmal die Datenbank und das Formular zugänglich.

Einbinden eines RSS Feed

Das Einbinden eines RSS Feed erreicht man mit folgender Zeile. <link rel="alternate" type="application/rss+xml" title="Aktuelle Seiten" href="/feed/rss.php" />

Erste Version Abfrage der XML Sitemap

Die erste Version meines RSS Feed hat einfach auf einfache Weise die XML Sitemap abgefragt. Der Nachteil war, das der Titel und die Beschreibung nicht mehr als die URL enthalten haben. Wegen der Performance ist diese Vorgehensweise bei grösseren Sitemaps sehr ungeeignet und jede noch so kleine Änderung würde eine Aktualisierung des Feed verursachen.

Abfrage XML Sitemap
ob_start();
echo '<?xml version="1.0" encoding="UTF-8"?>';
error_reporting(E_ALL);
echo '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel>';
echo '<atom:link href="http://joerghuelsermann.de/feed/rss.php" rel="self" type="application/rss+xml" />';
echo '<title>Jörg Hülsermann</title>';
echo '<link>http://joerghuelsermann.de/</link>';
echo '<description>Aktuelle Änderungen der letzten 2 Wochen</description>';
echo '<language>de-de</language>';
$xml = simplexml_load_file('../sitemap.xml');
foreach ($xml->url as $data) {
$file = $data->loc;
$filemtime = str_replace('http://joerghuelsermann.de/','',$file);
$url = $filemtime;
if (is_dir('../'.$url)) {
$url .= 'index.php';}
if (filemtime('../'.$url) >= time()-14*24*60*60) {
echo '<item><title>'.$data->loc.'</title><description>'.$data->loc.'</description>
<link>'.$data->loc.'</link><guid>'.$data->loc.'</guid>
<pubDate>'.gmdate('r',filemtime('../'.$url)).'</pubDate></item>';
}
}
echo '</channel></rss>';
$output = ob_get_clean();
$etag = '"'.dechex(getmyinode()).'-'.dechex(mb_strlen($output,'UTF-8')).'-'.dechex(getlastmod()).'"';
header('Content-Type: application/rss+xml; charset=UTF-8');
header('Etag: '.$etag);
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) and $_SERVER['HTTP_IF_NONE_MATCH'] == $etag){header('Status: 304');}
else{echo $output;}

Version Datenbank

Also habe ich zuerst mal die Struktur der Datenbank angelegt und über eine modifizierte Version der Abfrage der XML Sitemap die Datensätze generiert.

Struktur der Datenbank
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
CREATE TABLE IF NOT EXISTS `tabelle` (
`url` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`time` int(11) NOT NULL,
`titel` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`inhalt` varchar(250) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Bei der jetzigen Version nutze ich eine MySql Datenbank, die ich über den folgenden Weg abfrage.

Abfrage Datenbank
ob_start();
echo '<?xml version="1.0" encoding="UTF-8"?>';
error_reporting(E_ALL);
echo '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel>';
echo '<atom:link href="http://joerghuelsermann.de/feed/rss.php" rel="self" type="application/rss+xml" />';
echo '<title>Jörg Hülsermann</title>';
echo '<link>http://joerghuelsermann.de/</link>';
echo '<description>Aktuelle Änderungen der letzten 2 Wochen</description>';
echo '<language>de-de</language>';
$last = (time()-14*24*60*60);
$rss = '';
$verbindung = mysqli_connect ('server','benutzername','passwort','datenbank');
mysqli_set_charset($verbindung,'utf8');
$abfrage = 'SELECT * FROM tabelle WHERE time > '.$last.' ORDER BY time DESC;';
$ergebnis = mysqli_query($verbindung,$abfrage);
if(mysqli_num_rows($ergebnis) != 0) {
while($row = mysqli_fetch_object($ergebnis)) {
$rss .= '<item><title>'.$row->titel.'</title><description>'.$row->inhalt.'</description>
<link>http://joerghuelsermann.de'.$row->url.'</link><guid>http://joerghuelsermann.de'.$row->url.'</guid>
<pubDate>'.gmdate('r',$row->time).'</pubDate></item>';}
}
echo $rss;
$abfrage = 'SELECT time FROM tabelle ORDER BY time DESC  LIMIT 1;';
$ergebnis = mysqli_query($verbindung,$abfrage);
while($row = mysqli_fetch_object($ergebnis)) {
$lastdb = $row->time;}
mysqli_close($verbindung);
echo '</channel></rss>';
$output = ob_get_clean();
$etag = '"'.dechex(getmyinode()).'-'.dechex(mb_strlen($output,'UTF-8')).'-'.dechex(max(getlastmod(),$lastdb)).'"';
header('Content-Type: application/rss+xml; charset=UTF-8');
header('Last-Modified: '.gmdate('r',$lastdb));
header('Etag: '.$etag);
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) and $_SERVER['HTTP_IF_NONE_MATCH'] == $etag){header('Status: 304');}
else{echo $output;}