Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] Mit PHP dynamisch einen RSS-Feed aktualisieren

Layoutprobleme? - Styleswitcher!

Antwort
 
Themen-Optionen
Alt 13.03.2007, 10:52 Nach oben    #1
Jann Hendrik
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 1.540
Standard [PHP] Mit PHP dynamisch einen RSS-Feed aktualisieren

Mit PHP dynamisch einen RSS-Feed aktualisieren
In diesem Tutorial wird erklärt, wie man mit PHP einen RSS-feed aktualisieren kann.


Was ist überhaupt RSS:
Zitat:
Zitat von http://de.wikipedia.org/wiki/Rss
RSS (Abkürzung für Really Simple Syndication, zu deutsch etwa „wirklich einfache Verbreitung“) ist ein elektronisches Nachrichtenformat, das es dem Nutzer ermöglicht, die Inhalte einer Webseite – oder Teile davon – als sogenannte RSS-Feeds zu abonnieren oder in andere Webseiten zu integrieren.
Wenn neue Seiten zur Internetpräsenz hinzugefügt wurden, oder sich bei bestehenden Änderungen ergeben haben, dann wird das im RSS-feed erwähnt und Abonnenten bekommen dies dann automatisch mitgeteilt.


Wie sieht der Aufbau einer solchen RSS-Datei aus?
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0">
  <channel>
    <title>Titel</title>
    <link>Adresse der Webpräsenz</link>
    <description>Kurze Beschreibung</description>
    <language>de-de</language>
    <copyright>urheberrechtliche Informationen</copyright>
    <pubDate>Datum</pubDate>
    <image>
      <url>Adresse der eingebundenen Grafik</url>
      <title>Titel des Bildes</title>
      <link>Adresse, mit der das Bild verknüpft werden soll</link>
    </image>

    <item>
      <title>Titel</title>
      <description>kurze Zusammenfassung</description>
      <link>Adresse zur Gesamtansicht</link>
      <author>Autor des Artikels &lt;E-Mail-Adresse&gt;</author>
    </item>

    …

  </channel>
</rss>
Dabei wird der Teil innerhalb <item>...</item> dann mehrfach wiederholt. So ist es möglich mehrere Seiten im RSS zu verlinken.

Das Datum, welches im oberen Bereich angegeben wird, ist von diesem Format:
Sat, 15 Nov 2003 09:59:01 +0200
Korrekt ausgedrückt ist das nach RFC 822 standardisiert. Mit PHP kann man dieses Format erreichen, wenn man bei date r als Parameter nutzt:
PHP-Code:
date('r'); 

Wie kann nun ein RSS erstellt werden?
Der Aufbau eines RSS ist nun klar; nun geht es darum das mit Mitteln von PHP nachzubauen.
Als Wissens-Grundlage zu diesem Tutorials im Umgang mit Textdateien dienen diese Tutorials: gaestebuch auf textdatei basierend und textdateien lesen und schreiben von inhalten.
Das Aktualisieren des RSS-feeds soll letztlich durch eine Funktion realisiert werden.

Beginnen wir mit dem Kopf-Teil, der ja immer gleich aufgebaut ist. Dabei wird die Funktion letztlich so sein, dass der Inhalt, der zum Ende in die Datei geschrieben wird während der Verarbeitung in einer Variable gesammelt wird. So bedarf es zum Ende nur eines Schreibvorganges.
PHP-Code:
<?php
    $content 
'<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0">

  <channel>
    <title>'
.$rss_titel.'</title>
    <link>http://'
.$rss_link.'</link>
    <description>'
.$rss_beschreibung.'</description>
    <language>'
.$rss_sprache.'</language>
    <copyright>(c) by '
.$rss_autor.' &lt;'.$rss_email.'&gt;</copyright>
    <pubDate>'
.date('r').'</pubDate>

'
;
    
// hier kommt später der Teil zu den einzelnen Seiten rein.

    
$content.="  </channel>
</rss>"
;
?>
Natürlich müßen die Variablen vorher mit Inhalt gefüllt werden!
PHP-Code:
<?php
    $rss_dateiname    
'rss.rss';
    
$rss_titel        '';
    
$rss_link         '';
    
$rss_beschreibung '';
    
$rss_sprache      'de-de';
    
$rss_autor        'Dein Name';
    
$rss_email        'noreply@domain.tld';
    
$rss_stunden      2;

    
$content '<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0">

  <channel>
    <title>'
.$rss_titel.'</title>
    <link>http://'
.$rss_link.'</link>
    <description>'
.$rss_beschreibung.'</description>
    <language>'
.$rss_sprache.'</language>
    <copyright>(c) by '
.$rss_autor.' &lt;'.$rss_email.'&gt;</copyright>
    <pubDate>'
.date('r').'</pubDate>

'
;
    
// hier kommt später der Teil zu den einzelnen Seiten rein

    
$content.="  </channel>
</rss>"
;
?>
Die Prüfung, ob die Datei existiert und beschrieben werden darf wird in der Funktion schreibeInDatei() vorgenommen, die in diesem Tutorial erklärt wird.

PHP-Code:
<?php
  
function makeRSS ()
  {
    
// Variablendeklaration
    
$rss_dateiname    'rss.rss';
    
$rss_titel        '';
    
$rss_link         '';
    
$rss_beschreibung '';
    
$rss_sprache      'de-de';
    
$rss_autor        'Dein Name';
    
$rss_email        'noreply@domain.tld';
    
$rss_stunden      2;

    
// Prüfung, ob überhaupt notwendig, dass wieder neu erstellt wird
    
if(filemtime($rss_dateiname) > (time()-60*60*$rss_stunden))
      return 
false;

    
// hier wird dann $content befüllt
    // ...
    // ...

    // und die Datei neu mit Inhalt gefüllt
    // ...
    // ...

    
return true;
  }
?>
Nun der Schreibvorgang in die Datei:
PHP-Code:
<?php
    
// Dateiinhalt wird geleert
    
$file fopen($rss_dateiname"w+");
    
fclose($file);

    
// Dateiinhalt wird geschrieben
    
schreibeInDatei($rss_dateiname$content)
?>
Und nun zum letzten Punkt - wie wird $content mit den einzelnen Seiten gefüllt?
Wenn der Inhalt der Internetseite in einer Datenbank liegt, dann reicht ein geeignetes Suchkriterium um die Seiten auszulesen. Normalerweise gibt es ein timestamp oder ein datum-Feld, welches zu jedem Eintrag klar deklariert, wann die Seite das letzte Mal geändert wurde.
Ob die weiteren Daten auch aus der Datenbank kommen, oder statisch deklariert werden, das hängt von euch ab!
Es geht letztlich nur darum in einer geeigneten Form an die Daten zu kommen. Eine Datenbank bietet sich in diesem Fall an!
PHP-Code:
<?php
    $sql 
"SELECT    UNIX_TIMESTAMP(`datum`) as UNIXTIMESTAMP, `titel`, `beschreibung`, `link`, `autor`, `email`
            FROM      content
            ORDER BY  `lastUpdatedAt` DESC
            LIMIT     0, 10"
;

    
$result mysql_query($sql) or exit();

    while(
$row=mysql_fetch_array($result))
    {
      
$datum $row['lastUpdatedAt'];

      
$content  .= "    <item>
      <title>"
.substr($row['titel'], 0150)."</title>
      <description>"
.$row['beschreibung']."</description>
      <link>"
.$row['link']."</link>
      <author>"
.$row['autor']." &lt;".$row['email']."&gt;</author>
      <pubDate>"
.date('r'$row['UNIXTIMESTAMP'])."</pubDate>
    </item>"
."\n\n";
    }
?>
Aufgrund des unterschiedlichen Bereichs, in dem Variablen definiert sind, müsste natürlich für eine Datenbank-Kommunikation noch vorher eine Verbindung zur selbigen aufgebaut werden.

Zusammen sieht das dann so aus:
PHP-Code:
<?php

  
function makeRSS ()
  {
    
// Variablendeklaration
    
$rss_dateiname    'rss.rss';
    
$rss_titel        '';
    
$rss_link         '';
    
$rss_beschreibung '';
    
$rss_sprache      'de-de';
    
$rss_autor        'Dein Name';
    
$rss_email        'noreply@domain.tld';
    
$rss_stunden      2;

    
// Prüfung, ob überhaupt notwendig, dass wieder neu erstellt wird
    
if(filemtime($rss_dateiname) > (time()-60*60*$rss_stunden))
      return 
false;

    
// Datenbank-Verbindung - hier nicht näher erwähnt

    
$content '<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0">

  <channel>
    <title>'
.$rss_titel.'</title>
    <link>http://'
.$rss_link.'</link>
    <description>'
.$rss_beschreibung.'</description>
    <language>'
.$rss_sprache.'</language>
    <copyright>(c) by '
.$rss_autor.' &lt;'.$rss_email.'&gt;</copyright>
    <pubDate>'
.date('r').'</pubDate>

'
;
    
// hier kommt nun der Teil zu den einzelnen Seiten rein
    
$sql "SELECT    UNIX_TIMESTAMP(`datum`) as UNIXTIMESTAMP, `titel`, `beschreibung`, `link`, `autor`, `email`
            FROM      content
            ORDER BY  `lastUpdatedAt` DESC
            LIMIT     0, 10"
;

    
$result mysql_query($sql) or exit();

    while(
$row=mysql_fetch_array($result))
    {
      
$datum $row['lastUpdatedAt'];

      
$content  .= "    <item>
      <title>"
.substr($row['titel'], 0150)."</title>
      <description>"
.$row['beschreibung']."</description>
      <link>"
.$row['link']."</link>
      <author>"
.$row['autor']." &lt;".$row['email']."&gt;</author>
      <pubDate>"
.date('r'$row['UNIXTIMESTAMP'])."</pubDate>
    </item>"
."\n\n";
    }
    
$content.="  </channel>
</rss>"
;

    
// Dateiinhalt wird geleert
    
$file fopen($rss_dateiname"w+");
    
fclose($file);

    
// Dateiinhalt wird geschrieben
    
schreibeInDatei($rss_dateiname$content)

    return 
true;
  }
?>

Wie kann ich das ohne cronjob regelmäßig aktualisieren?
Klar - eine Möglichkeit besteht darin, regelmäßig einen cronjob über eine Seite zu schicken, der den RSS-feed aktualisiert, doch nicht jeder hat die Möglichkeit auf derartige Mittel zurückzugreifen.
Die Alternative ist die, dass man bei jedem Aufruf der Seite den RSS-feed aktualisiert, oder (um Performance nicht zu verschwenden) bei jedem Seitenaufruf schaut, wie alt das RSS ist und es nur bei Bedarf aktualisiert.


Woher weiß der Besucher, dass ich sowas habe?
Im <head>-Bereich der HTML-Seite wird folgendes eingefügt:
HTML-Code:
<link rel="alternate" type="application/rss+xml" title="RSS" href="/newsfeed.rss" />
Aktuelle Browser stellen dann ein kleines Bild im Browser dar, so dass die Besucher nun wissen, dass die Seite ein feed hat.


Wenn man direkt auf die Datei verlinkt wird der Browser ein Baumschema anzeigen, weil es sich um eine XML-Datei handelt.
Man kann allerdings einen Header mitsenden, damit sich das ändert:
PHP-Code:
header('Content-type: application/rss+xml; charset=UTF-8'true); 
Weblinks:
Wikipedia-Artikel auf wikipedia.org
feed validieren auf w3.org
cronjob auf wikipedia.org

Jetzt solltet Ihr eigentlich in der Lage sein, RSS in eure Internetseite zu integrieren. Die verwendeten Funktionen findet Ihr alle im PHP-Manual.

Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im PHP-Forum mit einem Verweis auf dieses Tutorial.
Danke.

Ich hoffe, dass ich Euch hier etwas weiterhelfen konnte.

Grüße Jann Hendrik

changelog:
11.10.2007: einen kleinen Fehler ausgebessert. $ vergessen.
29.10.2007: header-Kommentar am Ende hinzugefügt. Danke an kampfgnom.

Geändert von Jann Hendrik (29.10.2007 um 19:00 Uhr).
Jann Hendrik ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

« [AJAX] Eine Einführung in AJAX und XMLHttpRequest | [PHP] Login-System No.2 »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge anzufügen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] vCard PHP Parser Jann Hendrik Tutorials 0 22.08.2007 10:24
PHP 5.1.5, PHP 4.4.4 und PHP 5.2.0 RC2 veröffentlicht Ben Nachrichten 2 01.09.2006 16:05
[PHP] FTP-Funktionen in PHP nutzen MrNiceGuy Tutorials 0 24.05.2006 14:18
[PHP] Erstellung und Bearbeitung von Bildern mittels PHP WarrenFaith Tutorials 1 23.08.2005 15:30
[PHP] Kontrollstrukturen in PHP Jann Hendrik Tutorials 7 09.12.2004 22:28


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:52 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.6.7, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

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 41 42 43 44