Tom: Script ausführen und Ergebnis sichern

Beitrag lesen

Hello,

ich habe mehrere tolle RSS Feeds die auch sehr gefragt sind. Leider entspricht jede Abfrage einer Datenbankabfrage.
Um nun den Serverload etwas herunter zu dezimieren, möchte ich per php und Cronjob die Abfrage im 5 Min Tackt in eine andere Datei schreiben.

Das habe ich zwar jetzt nicht verstanden, aber das muss ich auch nicht unbedingt.
Ich frage mich nur, warum Du die Datei dann immer überschreibst?
Dann brauchst Du auch vorher nicht zu gucken, ob sie vorhanden ist.

Mein Ansatz ist:
<?php

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

// Sichergehen, dass die Datei existiert und beschreibbar ist

hier baust Du Dir einen "TOCTOU"-Fehler. Wofür das is_writable() wirklich gut ist

kann ich mir nicht denken. Vernünftige FehlerNUMMMERN bei fopen() wären wesentlich

besser. Aber das kannst Du ja nicht ändern, wenn das PHP-Konzept hier kaputt ist.

Jedenfalls ist die Abfrage fast) für die Füße...

if (is_writable($ziel))

{

// Quellendatei öffnen

#> if (!$quelleopen = implode('', file($quelle)))
#  {

Dafür fragst Du hier überhaupt nicht, ob file() Erfolg hatte.

Implode() beschwert sich zwar mit einer Warnung, wenn file() false geliefert hat,

aber richtig wäre es, das Ergebnis von file() abzufragen.

Außerdem geht das inzwischen auch in einem Schritt:

if (!$quelleopen = file_get_contents($quelle))
  {

print "Kann die Datei $quelle nicht öffnen";

}
  else   ## Wenn schon Kontrolle, dann auch konsequent
  {

// zieldatei datei öffnen
    if (!$zielopen = fopen($ziel, "r+"))

{

print "Kann die Datei $ziel nicht öffnen";

#                          exit;  ## Warum abbrechen und die Seite halbfertig hinterlassen?
      }
      else
      {

// Schreibe Quelle in Ziel .

## willst Du hier wirklich den Inhalt der Datei überschreiben?
      ## dann hättest Du sie auch gelich mit 'wb+' öffnen können.

if (!fwrite($zielopen, $quelleopen))

{
                          print "Kann in die Datei $ziel nicht schreiben";

exit;  ## hier auch wieder: Wieso Scriptabbruch?

}

}

fclose($zieldatei);   ##  Datei schließen nicht vergessen.
     print "Fertig, in Datei $ziel wurde $quelle geschrieben";

}

# fclose($quelleopen);   ## $quelleopen ist kein Handle, sondern ein Stringbuffer
  # fclose($zielopen);     ## man kann nur Dateien schließen, die auch offen sind.

}

else
  {
      print "Die Datei $ziel ist nicht schreibbar";
      ## und woran liegt es? Ist sie nicht vorhanden, oder ist sie schreibgeschützt?

}

?>

Die URL http://www.heise.de/newsticker/heise-atom.xml nutze ich in diesem Fall um eine sichere Quelle zu haben die keinen Timeout auslöst.

Leider habe ich trozdem einen Error 600 obwohl die Schreibrechte richtig vergeben worden sind.

Könntest Du bitte mal die Original-Fehlermeldung nachliefern?

Harzliche Grüße vom Berg und Frohe Weihnachtszeit

Tom

--
Nur selber lernen macht schlau