Chanelchen: Script alle 5 min aufrufen! (Urzeitabfrage coden :? )

Hi!!

Ich müsste ein ziemlich großes Newsscript ca. alle 5 min starten, und habe leider keine Cronjobs.

Ich könnte jedoch ein ZeitprüfScript mit in meine Hauptseite (hat alle paar Sekunden ein Aufruf) einbinden, was das Script alle 5 min startet...

Das Newsscript müsste also nach jedem Aufruf die genaue Zeit in eine Textdatei schreiben und das Zeitprüfscript müsste diese Datei nun auslesen und das Newsscript starten, wenn die Zeit mehr als 5 min zurück liegt... anderesfalls halt nichts machen...

leider bin ich ein PHP Neuling und habe keine Ahnung, wie ich sowas schreibe... - wär genial, wenn jemand für so eine Funktion einen groben Script Entwurf hätte

herzlichen Dank
Chanelchen

  1. Ich könnte jedoch ein ZeitprüfScript mit in meine Hauptseite (hat alle paar Sekunden ein Aufruf) einbinden, was das Script alle 5 min startet...

    Das Newsscript müsste also nach jedem Aufruf die genaue Zeit in eine Textdatei schreiben und das Zeitprüfscript müsste diese Datei nun auslesen und das Newsscript starten, wenn die Zeit mehr als 5 min zurück liegt... anderesfalls halt nichts machen...

    Dazu benötigst Du die Dateisystemfunktionen (http://www.php.net/manual/de/ref.filesystem.php), namentlich fopen() zum Öffnen einer Datei sowie fputs() um was reinzuschreiben und fgets() um was rauszuholen, sowie eine Funktion, die Dir die aktuelle Zeit liefert: time() (http://www.php.net/manual/de/ref.datetime.php).

    Alles, was Du dann noch machen mußt, ist in der jeweiligen Seite die Datei zu öffnen und die Zeit auszulesen. time() liefert Dir Datum/Zeit praktischerweise in Sekunden seit 1970. Ist der Unterschied zwischen der ausgelesenen und aktuellen Zeit also größer als 300 (5 Minuten * 60 Sekunden), muß Dein Skript was tun.

    Um eine Konvertierung zwischen der Zahl, die time() liefert und dem Text, den fgets() und fputs() verarbeiten, mußt Du Dich nicht kümmern, das macht PHP.

    Gruß,
      soenk.e

    1. Tausend Dank an soenk.e hab ich mit deiner tollen Anleitung perfekt hinbekommen!!!

      Eine Frage habe ich jedoch noch:
      Wie lege ich in der Timestamp Datei mehrere Timestamps für mehrere veschiedene Scripte an?

      Kann ich die Timestamps auch so auslesen, das ich sieh z.B. zurückgeben kann wie:

      • Infos wurden zuletzt aktualisiert um: XXXXX

      Script um Timestamp zu setzen
      <?php
      $myfile = fopen("timestamps.txt","w") or die ("Kann Timestamp Datei nicht schreiben!");
      fwrite($myfile, time());
      fclose($myfile);
      ?>

      Script um Timestamp auszulesen
      <?php

      $myfile = fopen("timestamps.txt","r") or die ("Kann Timestamp Datei nicht lesen!");
      $zeit = fread($myfile, 999);

      fclose($myfile);
      if( time() % $zeit > 200 )
      {
      include ("megascript.php");
      print "hallo";
      }
      ?>

      1. Eine Frage habe ich jedoch noch:
        Wie lege ich in der Timestamp Datei mehrere Timestamps für mehrere veschiedene Scripte an?

        Autsch. Der Standardansatz wäre pro Skript eine Zeile mit der jeweiligen Zeit, das ist aber aufwendig und fehlerträchtig.

        PHP bietet eine nette Funktion namens serialize() (unter Funktionen für Variablen, http://www.php.net/manual/de/ref.variables.php), mit der sich Variablen in einen speicherbaren Text verwandeln lassen (das Gegenstück, also Text->Variable nennt sich unserialize). Der Witz an der Sache: Das funktioniert mit wirklich jedem Variablentyp.
        Man könnte also alle Zeiten in ein Feld packen, das am Anfang jedes Skriptes auslesen, eventuell die aktuelle Zeit an die passende Stelle schreiben und dann wieder zurückschreiben.

        Wenn Du aber schon schreibst, daß Deine Seiten häufig aufgerufen werden, ist dieser Weg nicht der günstigste. Abgesehen von der Serverlast durch die ständigen Plattenzugriffe kann es vorkommen, daß sich die Skripte um den Dateizugriff schlagen müssen und so bei großem Andrang Fehler entstehen und Updates ausfallen.

        Deshalb ein wesentlich besserer Weg:
        Dein Skript, daß alle paar Minuten laufen soll, erzeugt ja sicher Daten. Du hast immer die Möglichkeit, zusammen mit diesen Daten ein Änderungsdatum zu speichern.
        Werden zum Beispiel Dateien erzeugt oder geändert passiert das sogar automatisch, denn jede Datei hat ein Änderungsdatum, das sich abfragen lässt (siehe http://www.php.net/manual/de/ref.filesystem.php).
        Alles, was Du in dem Fall machen müsstest, wäre das Dateiänderungsdatum zu holen und mit der aktuellen Uhrzeit zu vergleichen - kein lästiges Schreiben der letzten Änderung in eine Datei mehr.
        Auch bei Datenbankverwendung lässt sich sowas realisieren, SQL bietet zum Beispiel einen Typ timestamp an, der automatisch bei Änderungen aktualisiert wird.

        Kann ich die Timestamps auch so auslesen, das ich sieh z.B. zurückgeben kann wie:

        • Infos wurden zuletzt aktualisiert um: XXXXX

        Alles, was Du dazu brauchst, findest Du in dem Kapitel mit den Datums- und Zeitfunktionen, in dem Du auch schon time() gefunden hast (http://www.php.net/manual/de/ref.datetime.php).

        Tipp: Wenn Du die Anleitung zu einer Funktion vor der Nase hast, lies Dir grundsätzlich alle Funktionsbeschreibungen in der Nähe, also in dem Kapitel, kurz durch.
        Nur so bekommst Du einen Überblick, welche Funktionen vorhanden sind. Und bei der nächsten Frage klingelt's dann vielleicht schon von selber ("Irgendwo habe ich doch gelesen..").

        Wenn Du jedesmal nur die einzelnen Funktionen anschaust, lernst Du PHP nie richtig kennen.

        Script um Timestamp auszulesen

        [..]

        if( time() % $zeit > 200 )

        ===
        Was ist denn das? Normalerweise wäre da doch eher etwas in der Richtung

        if (time()-$zeit>5*60) // aktuelle abzüglich änderung größer 5 min?

        gefragt? Ich stehe ja ach gerne mal auf dem Schlauch; ist die Verwendung des Divisionsrestes zum Bestimmen des Abstands zweier Zeitpunkte höhere Mathematik? ;)

        Gruß,
          soenk.e

        1. Alles, was Du in dem Fall machen müsstest, wäre das Dateiänderungsdatum zu holen und mit der aktuellen Uhrzeit zu vergleichen - kein lästiges Schreiben der letzten Änderung in eine Datei mehr.
          Auch bei Datenbankverwendung lässt sich sowas realisieren, SQL bietet zum Beispiel einen Typ timestamp an, der automatisch bei Änderungen aktualisiert wird.

          Okay, sagen wir ich habe alle paar Sekunden einen Aufruf auf meiner Website d.h. es werden jedesmal ca. 4 Dateien nach ihrem Änderungsdatum (fileatime) befragt: geht sowas sehr auf die Serverperformance?

          Wieviel nimmt ansonsten eine Datenbankabfrage an Arbeit ein Anspruch:
          DB öffnen lesen DB schliessen?

          Was nehme ich da am besten?

          gefragt? Ich stehe ja ach gerne mal auf dem Schlauch; ist die Verwendung des Divisionsrestes zum Bestimmen des Abstands zweier Zeitpunkte höhere Mathematik? ;)

          hehe, wo ich jetzt langsam die Befehle lerne kann ich das auch umsetzen! - deinen Tipp befolge ich gerne! DANKE!!!

          1. Okay, sagen wir ich habe alle paar Sekunden einen Aufruf auf meiner Website d.h. es werden jedesmal ca. 4 Dateien nach ihrem Änderungsdatum (fileatime) befragt: geht sowas sehr auf die Serverperformance?

            filemtime meinte ich natürlich ;)

          2. Alles, was Du in dem Fall machen müsstest, wäre das Dateiänderungsdatum zu holen und mit der aktuellen Uhrzeit zu vergleichen - kein lästiges Schreiben der letzten Änderung in eine Datei mehr.
            Auch bei Datenbankverwendung lässt sich sowas realisieren, SQL bietet zum Beispiel einen Typ timestamp an, der automatisch bei Änderungen aktualisiert wird.

            Okay, sagen wir ich habe alle paar Sekunden einen Aufruf auf meiner Website d.h. es werden jedesmal ca. 4 Dateien nach ihrem Änderungsdatum (fileatime) befragt: geht sowas sehr auf die Serverperformance?

            Wieviel nimmt ansonsten eine Datenbankabfrage an Arbeit ein Anspruch:
            DB öffnen lesen DB schliessen?

            Das kann man so nicht beantworten, denn in beiden Fällen (filemtime() und Datenbank) sind ja auch noch Caches im Spiel, so daß Daten aus dem Speicher geholt werden können, anstatt teure Plattenzugriffe zu erzeugen.

            Worum es mir ging ist die relative Last, also die zwischen zwei Methoden. Nicht "wieviel kostest x" sondern "wieviel kostest x gegenüber y"?
            Und diese relative Last zum Beispiel unbestreitbar größer, wenn ich vier Dateien öffne, auslese, reinschreibe und schließe, als wenn ich von vier Dateien die Änderungszeiten abfrage.

            Die Sache mit der Datenbank hatte ich dementsprechend auch nur angesprochen, weil ich nicht weiß, was Du alle paar Minuten erneuern mußt.
            Wenn's eine zum Beispiel eine einfache HTML-Seite ist, ist filemtime() die beste Lösung. Wenn Du aber stattdessen irgendwelche Dinge in einer Datenbank erneuerst, wäre es sinnvoll, dort mit entsprechenden Mitteln (SQL: timestamp) zu arbeiten.

            Allgemein gesagt: Du solltest erst versuchen, diese Änderungszeiten dort zu bekommen, wo auch die dazugehörenden Daten stehen, bevor Du das Rad zweimal erfindest.

            Gruß,
              soenk.e