Ingrid: Abfragen nacheinander ausgeben

Hallo liebes Forum,

ich habe in einem Script mehrere Abfragen in der Form:

$url_status  = 'http://xyz.ab?1234=abcd;
$response = file($url_status);
echo $response[2];
echo ' - ';
echo $response[4];
echo '<hr>';

Insgesamt sind es 40 Abfragen, die alle einzeln erfolgen müssen.

Meine Seite wird erst dann angezeigt, wenn alle Abfragen abgearbeitet werden - das dauert leider ...

Gibt es eine Möglichkeit, dass die Abfragen nach und nach ausgegeben werden, damit der User sieht, dass etwas passiert?

Vielen Dank und liebe Grüße,

Ingird

  1. Tach!

    Gibt es eine Möglichkeit, dass die Abfragen nach und nach ausgegeben werden, damit der User sieht, dass etwas passiert?

    In PHP gibt es nur flush(), mit dem man den Webserver bitten kann, den Ausgabepuffer in Richtung Client zu entleeren. Dass der Client dann bereits das empfangene Stückchen rendert, ist aber nicht gesagt.

    "Sicher" ist nur, die Inhalte zum Beispiel einzeln per Ajax-Request anzufordern. Davon kann man auch mehrere parallel laufen lassen - spricht, es laufen dann auch mehrere PHP-Instanzen nebeneinander, und es muss nicht immer auf Fertigwerden oder Timeout jeder einzelnen Quelle gewartet werden. Alternativ kann man sich fragen, ob die Inhalte nicht gleich per Ajax von der Quelle geholt werden können (wobei da eventuell Cross-Origin-Verhinderungen zuschlagen können).

    dedlfix.

    1. In PHP gibt es nur flush(), mit dem man den Webserver bitten kann, den Ausgabepuffer in Richtung Client zu entleeren.

      Nein, flush() leert nur den Ausgabepuffer von PHP bzw. schickt diesen an den Webserver, das CGI oder sonstwohin - dem Webserver ist das erstmal egal, der zieht sein eigenes Ding durch.

      Interessant ist flush() vor allem für CLI-Programme die ewig laufen und man nur gelegentlich eine Brocken Ausgabe benötigt und nicht mit implicit_flush arbeiten möchte (was bei einem Webserver eine ziemlich Ressourcenintensive sache wäre).

      Ebenfalls dafür verantworlich sind die Puffereinstellungen in PHP:
      http://php.net/manual/de/outcontrol.configuration.php

      1. Tach!

        In PHP gibt es nur flush(), mit dem man den Webserver bitten kann, den Ausgabepuffer in Richtung Client zu entleeren.
        Nein, flush() leert nur den Ausgabepuffer von PHP bzw. schickt diesen an den Webserver, das CGI oder sonstwohin - dem Webserver ist das erstmal egal, der zieht sein eigenes Ding durch.

        Ok, hab nochmal bei flush() nachgelesen: PHP hat doch noch abseits vom Userspace-OB einen eigenen Puffer. Aber irgendwie muss es mit flush() doch bis zum Webserver durchdringen (zumindest bei Modul-Einbindung), wenn ich das recht verstehe: "Flushes the write buffers of PHP and whatever backend PHP is using (CGI, a web server, etc). This attempts to push current output all the way to the browser with a few caveats."

        Ebenfalls dafür verantworlich sind die Puffereinstellungen in PHP:
        http://php.net/manual/de/outcontrol.configuration.php

        Die betreffen aber (außer implicit_flush) das Userspace-OB. Da sind dann die ob_*()-Funktionen zuständig.

        dedlfix.

        1. Aber irgendwie muss es mit flush() doch bis zum Webserver durchdringen (zumindest bei Modul-Einbindung), wenn ich das recht verstehe: "Flushes the write buffers of PHP and whatever backend PHP is using (CGI, a web server, etc). This attempts to push current output all the way to the browser with a few caveats."

          In der Zeile danach steht dann "flush() may not be able to override the buffering scheme of your web server and it has no effect on any client-side buffering in the browser."

          Das "may not be able" ist leider sehr schwamming formuliert - aber ich vermute auch mal, dass das bei der Moduleinbindung kein Problem sein wird, bei der CGI-Variante aber schon - es scheint aber auch einen Zusammenhang mit mod_deflate und mod_gzip zu geben.

  2. Hallo,

    Meine Seite wird erst dann angezeigt, wenn alle Abfragen abgearbeitet werden - das dauert leider ...

    Standardmässig werden die Ausgaben eines PHP-Skriptes gepuffert (also der Inhalt landet in einem Zwischenspeicher, der erst am Ende des Skriptes ausgegeben wird).
    Normalerweise ist das erwünscht, aber in manchen Fällen (wie z.b. in Deinem) kann es sein, dass man dieses Verhalten nicht möchte

    Gibt es eine Möglichkeit, dass die Abfragen nach und nach ausgegeben werden, damit der User sieht, dass etwas passiert?

    Schau Dir mal die Output-Control-Funktionen von PHP an. Du könntest z.b. nach jeder Abfrage ein ob_flush aufrufen, damit wird der Inhalt des Puffers nach jeder Abfrage geleert und an den Client gesendet.

    Hoffe, das hilft Dir weiter.

    Viele Grüße,
    Jörg

    1. Tach!

      Standardmässig werden die Ausgaben eines PHP-Skriptes gepuffert (also der Inhalt landet in einem Zwischenspeicher, der erst am Ende des Skriptes ausgegeben wird).

      Meines Wissens hält PHP dafür aber keinen eigenen Puffer bereit, solange man nicht explizit die Output-Buffering-Funktionalität verwendet.

      Normalerweise ist das erwünscht, aber in manchen Fällen (wie z.b. in Deinem) kann es sein, dass man dieses Verhalten nicht möchte

      Dem PHP ist das egal - es könnte auch an der Konsole laufen und dann braucht es im Prinzip keine Pufferung -, der Webserver aber hätte gern weniger Arbeit und will nicht jedes Fitzelchen einzeln versenden. Deswegen puffert dieser, üblicherweise.

      Schau Dir mal die Output-Control-Funktionen von PHP an. Du könntest z.b. nach jeder Abfrage ein ob_flush aufrufen, damit wird der Inhalt des Puffers nach jeder Abfrage geleert und an den Client gesendet.

      Es wäre kontraproduktiv, würde Ingrid die OB-Funktionalität verwenden. Ein ob_flush() bringt aber nichts, wenn man nicht OB-puffert. flush() ohne ob_ könnte helfen, aber das auch nicht zwingend. Weiterer Vorschlag siehe: https://forum.selfhtml.org/?t=214980&m=1471756

      dedlfix.

    2. Standardmässig werden die Ausgaben eines PHP-Skriptes gepuffert (also der Inhalt landet in einem Zwischenspeicher, der erst am Ende des Skriptes ausgegeben wird).

      Nein, ist umgekehrt - wenn man die Ausgabe zwischenspeichern und erst am Ende ausgeben möchte, muss man das explizit tun.

      http://php.net/manual/de/ref.outcontrol.php