Thema geschlossen
Ergebnis 1 bis 1 von 1

Thema: [PHP] Mit PHP dynamisch einen RSS-Feed aktualisieren

  1. #1
    Projektleiter Avatar von Jann Hendrik
    Registriert seit
    02.12.2004
    Ort
    Wildeshausen
    Beiträge
    3.298
    Blog-Einträge
    32

    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 18:00 Uhr)
    Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!

Thema geschlossen

Aktive Benutzer

Aktive Benutzer

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

     

Ähnliche Themen

  1. [PHP] vCard PHP Parser
    Von Jann Hendrik im Forum Tutorials
    Antworten: 0
    Letzter Beitrag: 22.08.2007, 10:24
  2. Antworten: 2
    Letzter Beitrag: 01.09.2006, 16:05
  3. [PHP] FTP-Funktionen in PHP nutzen
    Von MrNiceGuy im Forum Tutorials
    Antworten: 0
    Letzter Beitrag: 24.05.2006, 14:18
  4. Antworten: 1
    Letzter Beitrag: 23.08.2005, 15:30
  5. [PHP] Kontrollstrukturen in PHP
    Von Jann Hendrik im Forum Tutorials
    Antworten: 7
    Letzter Beitrag: 09.12.2004, 21:28

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein

Impressum · Tutorials · Nutzungsbedingungen · thematisch sortierte Linklisten · Spendenaufruf · Team · Partnerprojekte

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 45 46 47 48