Seite 1 von 2

Script ausführen und speichern

Verfasst: 18.12.2007 23:22
von sts
Hallo,

ich habe diverse RSS feeds dich ich aus einer Datenbank auslese. Die RSS-Feeds sehr gefragt, und der Serverload steigt ins unermessliche. So muss ich diese nun zwischenspeichern und per Chronjob alle 5 Min auffrischen. Meine erste Überlegung war:

Code: Alles auswählen

<?php
 copy("rss-feed-auslesen.php" , "feed.rss");
?>
Nur wird hier das Script kopiert und nicht ausgeführt -> anschließend gespeichert.
Hat jemand eine Idee?

Verfasst: 18.12.2007 23:59
von gn#36
Vermutlich wäre es angebrachter entweder mit Output-Buffering und Include (geht aber nicht unbedingt bei allen Skripten) oder mit [php:file] arbeiten, jeweils in Kombination mit [php:fopen], [php:fwrite] und [php:fclose] wobei an file die Datei inklusive URL Pfad übergeben werden müsste, so dass sie Ausgeführt und nicht als Textdatei gelesen wird. Das funktioniert aber nicht unbedingt auf allen Servern.

Wenn es geht würde ich die erste Methode bevorzugen.
[php:ob_start] vor, [php:ob_get_clean] nach dem Include und dann mit fopen usw die ausgelesenen Daten in die Datei schreiben.

Verfasst: 19.12.2007 09:12
von sts
Hm,

ich habe da mal etwas gebastelt:

Code: Alles auswählen

<?php

$quelle = 'http://www.heise.de/newsticker/heise-atom.xml';
$ziel = '/html/test/ziel.rss';

// Sichergehen, dass die Datei existiert und beschreibbar ist
if (is_writable($ziel)) {

// Quellendatei öffnen
if (!$quelle-open = fopen($quelle, "r")) {
         print "Kann die Datei $quelle nicht öffnen";
         exit;
    }
    // zieldatei datei öffnen
    if (!$ziel-open = fopen($ziel, "r+")) {
	         print "Kann die Datei $ziel nicht öffnen";
	         exit;
    }

	    // Schreibe Quelle in Ziel .
	    if (!fwrite($ziel-open, $quelle-open)) {
	        print "Kann in die Datei $ziel-open nicht schreiben";
	        exit;
    }

 print "Fertig, in Datei $ziel wurde $quelle geschrieben";

fclose($quelle);
fclose($ziel);

} else {
    print "Die Datei $ziel ist nicht schreibbar";
}
?>
Leider bekomme ich immer folgende Fehlermeldung:
Parse error: syntax error, unexpected '=' in /var/www/test/html/test/test.php on line 10
Nach der Anleitung müsste es richtig sein. Hast du evt. einen Tip?

Verfasst: 19.12.2007 14:17
von gn#36
Das Minuszeichen ist ein Operator. Der lässt sich nicht in Variablennamen benutzen. Eine Berechnung durchzuführen ohne das Ergebnis zu benutzen ist ok, aber du kannst einer Operation ($quelle - open) keinen Wert zuweisen, da die Operation selbst einen Wert besitzt. Deshalb der Fehler.

Bist du außerdem sicher, dass die Funktion das tut was sie soll?
fwrite erwartet einen Dateihandle (soweit gut) und einen String (du gibst einen weiteren Handle weiter). Du musst die quelle mit implode('', file(...)) öffnen.

Verfasst: 19.12.2007 19:28
von Seether
Gibt es da nicht mit vielen Feed-Anbietern Probleme? Oft wird ja gesagt, dass den Feed übernehmen muss wie er ist und ihn nicht speichern darf.
Weiß aber nicht wie es mit kurzem zwischenspeichern aussieht. Mal abgesehen davon, dass es schwer nachzuweisen ist.

Verfasst: 19.12.2007 20:10
von sts
@Seether

der heise feed ist nur zum Testen.

@gn#36
Das Minuszeichen ist ein Operator
Hiermit hast du vollkommen recht gehabt. Der Fehler ist nun nicht mehr vorhanden.

Zum 2 Test habe ich nun alle Rechte (testhalber) auf 777 gesetzt (Datein/Verzeichnis).
Das dumme ist die nächste 500 Fehlermeldung:
Premature end of script headers: test.php
Scriptzeit max 60 Sek /Memorylimit 30MB

Verfasst: 21.12.2007 09:52
von sts
push

Verfasst: 21.12.2007 14:21
von gn#36
Kannst du noch mal die aktuelle Version zur Verfügung stellen?

Verfasst: 21.12.2007 14:42
von sts
Natürlich

Code: Alles auswählen

 <?php

$quelle = 'http://stsboard.de/rdf.php';
$ziel = '/html/test/ziel.rss';

// Sichergehen, dass die Datei existiert und beschreibbar ist
if (is_writable($ziel)) {

// Quellendatei öffnen
if (!$quelleopen = fopen($quelle, "r")) {
         print "Kann die Datei $quelle nicht öffnen";
         exit;
    }
    // zieldatei datei öffnen
    if (!$zielopen = fopen($ziel, "r+")) {
                         print "Kann die Datei $ziel nicht öffnen";
                         exit;
    }

                    // Schreibe Quelle in Ziel .
                    if (!fwrite($zielopen, $quelle-open)) {
                        print "Kann in die Datei $zielopen nicht schreiben";
                        exit;
    }

 print "Fertig, in Datei $ziel wurde $quelle geschrieben";

fclose($quelle);
fclose($ziel);

} else {
    print "Die Datei $ziel ist nicht schreibbar";
}
?>

Verfasst: 21.12.2007 22:18
von gn#36
gn#36 hat geschrieben: Bist du außerdem sicher, dass die Funktion das tut was sie soll?
fwrite erwartet einen Dateihandle (soweit gut) und einen String (du gibst einen weiteren Handle weiter). Du musst die quelle mit implode('', file(...)) öffnen.
Das solltest du noch ändern.

Premature End of Script Headers bedeutet, der PHP Interpreter hat keine Ausgabe an den Webserver zurückgeliefert oder keinen Content-Type Header. Da eigentlich standardmäßig bei der ersten Ausgabe der default Header geschickt wird dürfte es daran eigentlich nicht liegen. Eine vage Vermutung wäre, dass das Öffnen der URL zu lange braucht und das Skript abgebrochen wird oder sogar dabei abstürzt.