Siddy: Statusanzeige einbauen

Morgen..

Ich führe eine Schleife mit SQL Anweisungen aus. Das sind INSERT INTOs und UPDATES. Wie kann ich jetzt während dieser Schleife auf dem Bildschirm eine Statusanzeige ausgeben, wie viele Anweisungen schon ausgeführt wurden?

Beispiel:

Fortschritt: 30%

  1. Von wieviel Abfragen sprechen wir denn da?

    Es müssen nämlich schon sehr viele sein damit man den Fortschritt überhaupt sieht.

    1. Von wieviel Abfragen sprechen wir denn da?

      Es müssen nämlich schon sehr viele sein damit man den Fortschritt überhaupt sieht.

      Ca. 50.000

      1. Hallo!

        Von wieviel Abfragen sprechen wir denn da?
        Es müssen nämlich schon sehr viele sein damit man den Fortschritt überhaupt sieht.
        Ca. 50.000

        Ich hab einen ähnlichen Fall (importieren von vielen Bildern) folgendermaßen gelöst, um nicht in ein PHP Timeout zu laufen und um dem User ein Feedback zu liefern.

        Alle Bilder die eingelesen werden sollen in ein Array schreiben und als Session Variable speichern.
        Pro durchlauf N Bilder aus dem Array holen und abarbeiten.
        Text ausgeben: Noch X Bilder zu verarbeiten. Noch dazu ein animiertes Gif ausgeben - signalisiert: "hier passiert etwas"
        Mit einem HTML Meta Refresh diesselbe Seite aufrufen.
        So lange wiederholen, solange Bilder im Array vorhanden sind.

        mfg
          frafu

        1. n'abend,

          Alle Bilder die eingelesen werden sollen in ein Array schreiben und als Session Variable speichern.
          Pro durchlauf N Bilder aus dem Array holen und abarbeiten.
          Text ausgeben: Noch X Bilder zu verarbeiten. Noch dazu ein animiertes Gif ausgeben - signalisiert: "hier passiert etwas"
          Mit einem HTML Meta Refresh diesselbe Seite aufrufen.
          So lange wiederholen, solange Bilder im Array vorhanden sind.

          auch ne idee...

          ansonsten würde set_time_limit(0); das timeout-problem lösen...
          und kontinuierliche echo '<script type="text/javascript">wieder20Bilderfertig();</script>';

          weiterhin schönen abend...

          --
          wer braucht schon großbuchstaben?
          sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|
          1. Hallo!

            ansonsten würde set_time_limit(0); das timeout-problem lösen...
            und kontinuierliche echo '<script type="text/javascript">wieder20Bilderfertig();</script>';

            Grundsätzlich gehe ich aber davon aus, dass der Server im save_mode läuft und dann nützt dir set_time_limit ganz genau gar nix.

            Wäre ich Serveradministrator, dann würde ich mir ja auch was dabei denken, wenn ich die max. Ausführungszeit auf 30 sec. beschränke. Dann will ich ja nicht, dass mir irgendein dahergelaufener Möchtegernprogrammierer mit Endlosschleifen oder so den Server blockiert.

            mfg
              frafu

            1. n'abend,

              Grundsätzlich gehe ich aber davon aus, dass der Server im save_mode läuft und dann nützt dir set_time_limit ganz genau gar nix.

              nun... ich mache seit geraumer zeit nur auf meinen eigenen kisten rum.. und dort gibts sowas wie den safe_mode nicht... vielleicht hab ich mich deshalb nie mit diesem thema befasst? per gelegenheit mal nachholen...

              Wäre ich Serveradministrator, dann würde ich mir ja auch was dabei denken, wenn ich die max. Ausführungszeit auf 30 sec. beschränke. Dann will ich ja nicht, dass mir irgendein dahergelaufener Möchtegernprogrammierer mit Endlosschleifen oder so den Server blockiert.

              damit könntest du recht haben :)

              weiterhin schönen abend...

              --
              wer braucht schon großbuchstaben?
              sh:( fo:# ch:# rl:° br:> n4:& ie:{ mo:} va:) de:] zu:} fl:{ ss:? ls:[ js:|
        2. Hi

          Mit einem HTML Meta Refresh diesselbe Seite aufrufen.

          Wie geht das?

          bzw. was schreibe ich $hier
          <meta http-equiv="refresh" content="5; URL=$hier">

          Wenn ich den Namen der formularverarbeitung.php angebe, fängt das Ding ja jedesmal von vorne an zu laufen?!?
          Und wie kille ich diese Anzeige, wenn ich ein echo"$Ausgabe"; endlich fertig habe?

          Alex

          1. Hallo!

            bzw. was schreibe ich $hier
            <meta http-equiv="refresh" content="5; URL=$hier">

            Wenn ich den Namen der formularverarbeitung.php angebe, fängt das Ding ja jedesmal von vorne an zu laufen?!?
            Und wie kille ich diese Anzeige, wenn ich ein echo"$Ausgabe"; endlich fertig habe?

            Du brauchst nichts zu killen. Du brauchst nur eine IF Bedingung einbauen. Nur wenn noch nicht fertig => rufe meta refesh auf, ansonsten gib eine Message "Fertig" aus.

            mfg
              frafu

  2. echo $begrüßung;

    Ich führe eine Schleife mit SQL Anweisungen aus. Das sind INSERT INTOs und UPDATES. Wie kann ich jetzt während dieser Schleife auf dem Bildschirm eine Statusanzeige ausgeben, wie viele Anweisungen schon ausgeführt wurden?

    Beispiel:
    Fortschritt: 30%

    Es geht nicht, dass sich in deinem Beispiel die 30% ändert. Jedenfalls nicht mit einfachen HTTP-, HTML- oder Plain-Text-Mitteln. Wenn du aber mit einer Anzeige der Form

    0% - 10% - 20% - 30%

    usw. leben kannst, dann kannst du probieren, diese Textstücke jeweils gefolgt von einem Aufruf von flush() einzeln an den Browser zu schicken. Beachte, dass du keine vollständigen Einfluss darauf hast, was der Browser daraus macht. Beispielsweise wird es in einer Tabelle nicht unbedingt funktionieren, weil diese erst komplett beim Client angekommen sein muss. Vorher hat er Schwierigkeiten, sie zu rendern. Andererseits sind Browser recht tolerant. Sie versuchen auch aus kaputtem HTML noch was zu machen. Experimentiere ein wenig damit. Und als Zeitverzögerung kannst du statt Datenbankbefehlen auch sleep() verwenden.

    echo "$verabschiedung $name";

  3. Morgen..

    Ich führe eine Schleife mit SQL Anweisungen aus. Das sind INSERT INTOs und UPDATES. Wie kann ich jetzt während dieser Schleife auf dem Bildschirm eine Statusanzeige ausgeben, wie viele Anweisungen schon ausgeführt wurden?

    Ich habe mal ein Beispiel gemacht:
    http://tm3.osmer.de/fortschrittsanzeige.php

    Noch kann gewettet werden, wann der Server wg. Timeout abbricht.

    Uuuuups - beim Testen stelle ich gerade fest, dass der Server ewig lange läuft, aber der nächste Besucher muss so lange im Wartezimmer Platz nehmen.

    Eigentlich geil, keine Probleme mit gleichzeitigem Zugriff auf die Datenbank ... oder?

    IST DAS IMMER SO ???

    Hier der Code:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>FORTSCHRITTSANZEIGE</title>
    </head>

    <body>

    <h1>Fortschrittsanzeige</h1>
    <p>Dieses PHP- Script wird 800, nein 10 sec. laufen. Mal sehen, ob der Server vorher abbricht. </p>

    <?
    //for ($i=1; $i<801; $i++ ) {   OH NOOOOO
      for ($i=1; $i<10; $i++ ) {
        echo $i." / ";
        flush();
        sleep( 1 );
      }
    ?>
    <p>Und fertig, der Server hat durchgehalten.</p>
    </body>
    </html>

    Kalle

    1. echo $begrüßung;

      Uuuuups - beim Testen stelle ich gerade fest, dass der Server ewig lange läuft, aber der nächste Besucher muss so lange im Wartezimmer Platz nehmen.
      IST DAS IMMER SO ???

      Das liegt vermutlich an deinem Browser. Mit dem FF konnte ich das Verhalten mit zwei Tabs nachvollziehen. Ein FF und ein Opera laufen gleichzeitig. Letzterer hat aber keine Lust die Bröckchen einzeln zu zeigen sondern zeigt erst die Einleitung und nach 10 Sekunden den Rest. Dabei zählt jedoch die Fortschrittsanzeige ein paar ankommende Bytes hoch.

      Ein weiterer Test mit zwei Scripts, unterschiedlichen URLs (sprich: Dateinamen der Scripte unterscheiden sich), aber gleichem Inhalt lief in zwei FF-Tabs gleichzeitig.

      echo "$verabschiedung $name";