ceejay: PHP - Backgroundprozesse / Intervalls, wie in JavaScript ? window.setTimeOut()

Meine Aufgabenstellung:

Eine .html-Seite (möglicherweise m. Frames) darstellen.
Diese .html-Seite (oder 1 innerhalb des Framesets) soll einen anderen Inhalt darstellen, erhalten, sobald ein "Moderator/Administrator" das so will. Also auf den Knopf drückt.

Mein Ansatz:
1.) mit PHP, da ich kein Java kann und Perl mir ungeeignet erscheint.
2.) eine configdatei in der der Name der neu anzuzeigenden Datei o.ä.
    steht, diese wird dann auf "modified" oder veränderten Inhalt
    überprüft, und sollte das der Fall (modified/changed) wird der
    neue Inhalt dargestellt.
3.) dasselbe wie bei 2.) nur das die Daten nicht aus nem File sondern
    von einem geöffneten Port auf einem Server abgefragt werden.
    ähnlich Port 13 (MOTD ???)
4.) entweder wird eines der Frames mit dem neuen Inhalt befüllt.
    (per document.locationdocument.writehttp-headerwasauchimmer)
    Oder: alles besteht aus einer .html Seite, und geparsed, oder
    per Object/Class - Aufruf, oder so - habe davon noch nicht genug
    ahnung/erfahrung - ein object für die Ausgabe gibt es bereits,
    dieses Objekt enthält den code der .html-seite und wird mit dem
    Bildlink ("/pix/bild.jpg") aufgerufen ($pp = new PP("/pix/bild1.jpg"); $pp->Display(); // funktioniert erstmal)
5.) Socket-Connections - aber damit hab ich auch noch zu wenig
    Erfahrung.

Mein Problem:
1.) der Überwachungsprozess, der entscheided, ob ein neues
    Bild/Inhalt dargestellt werden soll, soll im Hintergrund laufen.
    also ähnlich wie bei JavaScript window.setTimeout, oder
    setInterval usw. , nur das ich das irgendwie nicht so schnalle

Meine erste Lösung war recht simpel:
$altedatei="";
function Loop() {

$zeit     = time();      //aktuelle zeit in sek.
$sollzeit = $zeit + 5;   //plus 5 sekunden = sollzeit

while( $sollzeit > $zeit ) {
      $datei = join("", file("config.txt","r") );
      $datei = chop($datei);
      if($datei != $altedatei) {
         $altedatei=$datei;
         $pp = new Presentation("html-template.html",$datei);
         $pp->Display();
         $zeit = time(); //aktuelle zeit in sek.
      }
      flush();
      sleep(1);          // warte 1 sekunde
}
flush();
Loop();
}

Leider bringt mich das nicht weiter, da der Loop nicht im Hintergrund durchgeführt, sondern der Browser dabei die ganze Zeit hängt. Wenn man dabei mal davon absieht, das es sich hierbei um einen Endlosloop handelt. Ich würde lieber mit window.setInterval() oder window.settimeout() arbeiten, habe aber vergleichbares in PHP4 noch nicht finden können. Leider half flush() auch nichts, es wird dennoch nichts ausgegeben.

Wer kann helfen ?!

mfg
cee jay

  1. Hi ceejay,

    Meine Aufgabenstellung:

    Eine .html-Seite (möglicherweise m. Frames) darstellen.
    Diese .html-Seite (oder 1 innerhalb des Framesets) soll einen anderen Inhalt
    darstellen, erhalten, sobald ein "Moderator/Administrator" das so
    will. Also auf den Knopf drückt.

    Das geht so ohne weiteres nicht. Du brauchst auf jeden Fall Unterstützung von
    der Client Seite (also dem Browser).
    Normalerweise fordert der Browser eine Seite an (zu dem Zeitpunkt läuft dann
    für einige 10ms auch das phpScript, der Server schiebt sie dann ins Netz und
    einige Sekunden später ist das ganze erledigt.

    Dir bleibt also nix anderes übrig als den Browser regelmässig nachgucken zu
    lassen ob was neues da ist.
    Unter Mithife von JavaScript geht das sogar einigermassen vernünftig:
    Mach einen (kleinen, leeren) Frame der sich selber reloaded (z.b. alle 30 sec).
    Wenn der "Moderator den Knopf drückt" wird nicht mehr dieser (leer) Frame vom
    Server geliefert, sondern einer, der ein JavaScript enthält, was eines der
    Inhaltsframes neulädt.
    Ohne JavaScript könntest du versuchen, auf die Reloads mit einem
    '304 Not Modified' header zu reagieren, ich fürchte aber dass das nicht geht.
    (Er wird einfach alle 30 sec das Bild neu aufbauen und das sieht sch**** aus.)

    Gruss,
    Carsten

    1. Hi ceejay,

      Meine Aufgabenstellung:

      Eine .html-Seite (möglicherweise m. Frames) darstellen.
      Diese .html-Seite (oder 1 innerhalb des Framesets) soll einen anderen Inhalt
      darstellen, erhalten, sobald ein "Moderator/Administrator" das so
      will. Also auf den Knopf drückt.

      Das geht so ohne weiteres nicht. Du brauchst auf jeden Fall Unterstützung von
      der Client Seite (also dem Browser).
      Normalerweise fordert der Browser eine Seite an (zu dem Zeitpunkt läuft dann
      für einige 10ms auch das phpScript, der Server schiebt sie dann ins Netz und
      einige Sekunden später ist das ganze erledigt.

      Dir bleibt also nix anderes übrig als den Browser regelmässig nachgucken zu
      lassen ob was neues da ist.
      Unter Mithife von JavaScript geht das sogar einigermassen vernünftig:
      Mach einen (kleinen, leeren) Frame der sich selber reloaded (z.b. alle 30 sec).
      Wenn der "Moderator den Knopf drückt" wird nicht mehr dieser (leer) Frame vom
      Server geliefert, sondern einer, der ein JavaScript enthält, was eines der
      Inhaltsframes neulädt.
      Ohne JavaScript könntest du versuchen, auf die Reloads mit einem
      '304 Not Modified' header zu reagieren, ich fürchte aber dass das nicht geht.
      (Er wird einfach alle 30 sec das Bild neu aufbauen und das sieht sch**** aus.)

      Gruss,

      »»  Carsten

      habe gestern noch ein bischen in den tut's gestöbert - hatte auch was zum background-processing gefunden, bezog sich aber eher auf execute() bzw. start() - also in dem Fall unbrauchbar -
      die JavaScript variante ist die die ich zur Zeit eh fahre, bzw. sogar noch einfacher per META REFRESH - und die datei wird vom admin, per script mit neuer bilddatei befüllt - funktioniert ganz gut, nur wollt ich eben den störenden sekündlichen klick des IE unterdrücken, indem ich das ein wenig "schicker" gestalte .... nunja

      die javascript / meta-tag variante würde ja so auch ausreichen, nur das freund admin unbedingt will, das die aktualisierung dann stattfinden, wann er es will, und GLEICHZEITIG bei allen ---- relativ machbar ist das nur, wenn das Intervall bei 1 Sekunde oder weniger liegt....das Klickgeräusch dazu ist schonmal ganz toll ;)=

      jedoch habe ich noch eine weitere Methode, und die wirds dann wahrscheinlich werden: FLASH 4 !!!!
      Wozu hat man Flash 4 ? einfach loopen lassen, dabei immer wieder ein config-file abfragen, wenn inhalt neuer als vorher, dann aufruf einer javascript-funktion, die den rest erledigt ....
      dadurch das flash loopen kann, ohne das der browser klickert geht das ganz gut,
      außerdem kann ich da ein NewsTickerflash einfach erweitern und schon macht es zusätzlich auch noch die steuerung des refresh ;)

      trotzdem danke Carsten -
      vielleicht fällt Dir ja nochwas dazu ein ?

      cYa
      cee jay