Klaus: Ausgabe während Berechnung

Hallo,

ich würde gerne ein PHP-Script, dass recht lange läuft und zahlreiche Berechnungen anstellt, dazu veranlassen schon Zwischenergebnisse zu liefern.

Beispiel: Wenn ich aus mehreren Datenbanken, nach intensiven Prüfungen etc, einen ersten Treffer finde, dann soll dieser bereits ausgegeben werden, obwohl das Script noch weiter nach weiteren Treffern sucht.
Sobald der nächste Treffer gefunden wird, wird auch dieser ausgegeben und weitergesucht.

Wie ist das zu bewerkstelligen?

Wenn ich das Script zur Suche auslagere und über Ajax aufrufe, bin ich zwar in der Lage, ein Div einzublenden, mit dem Hinweis "Suche wird gestartet" und am Ende auch wieder auszublenden, aber auf den Suchdurchlauf habe ich damit keinen Einfluss.

Hat jemand eine Idee?

  1. Mahlzeit Klaus,

    Wie ist das zu bewerkstelligen?

    Durch entsprechende Ausgabe-Pufferung.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. ich würde gerne ein PHP-Script, dass recht lange läuft und zahlreiche Berechnungen anstellt, dazu veranlassen schon Zwischenergebnisse zu liefern.

    Beispiel: Wenn ich aus mehreren Datenbanken, nach intensiven Prüfungen etc, einen ersten Treffer finde, dann soll dieser bereits ausgegeben werden, obwohl das Script noch weiter nach weiteren Treffern sucht.
    Sobald der nächste Treffer gefunden wird, wird auch dieser ausgegeben und weitergesucht.

    Wie ist das zu bewerkstelligen?

    Es stellt sich eher die Frage, wie man das verhindert (ob_start()). Wenn man nichts macht um es zu verhindern, dann wird das genau so funktionieren wie Du das willst, vorausgesetzt, Du gibst das Zwischenergebnis auch zwischendurch aus (echo). Ob ein Browser das Zwischenergebnis auch vorzeitig ausgibt, ist aber nicht garantiert.

    1. echo $begrüßung;

      Es stellt sich eher die Frage, wie man das verhindert (ob_start()). Wenn man nichts macht um es zu verhindern, dann wird das genau so funktionieren wie Du das willst, vorausgesetzt, Du gibst das Zwischenergebnis auch zwischendurch aus (echo). Ob ein Browser das Zwischenergebnis auch vorzeitig ausgibt, ist aber nicht garantiert.

      Da der Webserver einen internen Puffer hat, um nicht jedes von PHP oder anderen eingebundenen Modulen erzeugte Byte einzeln zum Client zu befördern, muss man den Webserver explizit bitten, wenn man dies doch haben möchte. Die PHP-Funktion dazu heißt flush(). Allerdings funktioniert dieser Mechanismus nicht mit allen Webservern. Und auch die Browser können dem Verlangen entgegenstehen, denn die können manchmal nicht sofort losrendern, wenn denen wesentliche Informationen fehlen, beispielsweise zur Struktur einer Tabelle.

      echo "$verabschiedung $name";

      1. Hello,

        Da der Webserver einen internen Puffer hat, um nicht jedes von PHP oder anderen eingebundenen Modulen erzeugte Byte einzeln zum Client zu befördern, muss man den Webserver explizit bitten, wenn man dies doch haben möchte. Die PHP-Funktion dazu heißt flush(). Allerdings funktioniert dieser Mechanismus nicht mit allen Webservern. Und auch die Browser können dem Verlangen entgegenstehen, denn die können manchmal nicht sofort losrendern, wenn denen wesentliche Informationen fehlen, beispielsweise zur Struktur einer Tabelle.

        Mit flush() wird aber mMn nur der Ausgebepuffer von PHP geleert. Der Webserver kann noch einen eigenen haben, den er erst leert, wenn er ein IP-Paket "voll" bekommt oder wann auch immer (IP ist ja schon wieder eine andere Schicht...). Irgendjemand hier im Forum hat mal herausgefunden, dass man in solchen Fällen seine Ausgaben einfach mit einem Bündel Leerzeichen auf ca. 512 Zeichen auffüllen soll und dann erst den Buffer flushen. HTML ignoriert diese in der Anzeige, den Traffic interessierts bei eingeschalter Kompression auch nicht sonderlich, aber die Bucket Chain aus Buffers lässt sich damit einigermaßen manipulieren.

        Und PHP macht beim Flushen von STDOUT manchmel nicht mit, wenn noch andere Buffers (Dateiausgaben) zur Ausgabe gefüllt wurden. Woran das liegt, habe ich noch nicht herausgefunden.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. echo $begrüßung;

          Mit flush() wird aber mMn nur der Ausgebepuffer von PHP geleert. Der Webserver kann noch einen eigenen haben, den er erst leert, wenn er ein IP-Paket "voll" bekommt oder wann auch immer (IP ist ja schon wieder eine andere Schicht...). Irgendjemand hier im Forum hat mal herausgefunden, dass man in solchen Fällen seine Ausgaben einfach mit einem Bündel Leerzeichen auf ca. 512 Zeichen auffüllen soll und dann erst den Buffer flushen.

          Meine eigenen Beobachtungen sagen, dass zumindest ein flush() bei der Modulvariante von PHP im Apachen zur sofortigen Ausgabe in Richtung Client führt, auch ohne Füllzeichen. Das Handbuch führt auch noch einige Beispiele zum Verhalten von flush() auf. Wenn jemand anderes was anderes beobachtet hat, lag vermutlich eine andere Systemkonstellation vor.

          echo "$verabschiedung $name";

      2. Da der Webserver einen internen Puffer hat, um nicht jedes von PHP oder anderen eingebundenen Modulen erzeugte Byte einzeln zum Client zu befördern, muss man den Webserver explizit bitten, wenn man dies doch haben möchte.

        Da habe ich andere Erfahrungen gemacht, nur nicht grade mit einzelnen Bytes. Wir haben wohl aber beide Recht und Unrecht und wenn ich möglichst sicher sein will, daß es auch gestückelt rausgeht, dann verwende ich auch flush().