Ankündigung

Einklappen
Keine Ankündigung bisher.

Progress Class - Problem mit Flush

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Progress Class - Problem mit Flush

    Hallo,
    inspiriert von einer Progress-Klasse die ich irgendwo einmal per Google aufgeschnappt hatte, wollte ich folgendes anstellen (PHP 4):
    Das Ganze soll sich wie eine Art Ladebalken entwickeln, dazu wird JavaScript verwendet.
    PHP-Code:
    <?php

    class progress {
            var 
    $message '';
            var 
    $width '';
            var 
    $percent 0;

            function 
    setMessage($message) {
                     echo 
    '<script language="javascript" type="text/javascript">';
                     echo 
    'setMessage("'.$message.'");';
                     echo 
    '</script>';
                     echo 
    "\r\n\r\n";
                     
    flush();
            }
            
            function 
    setPercent($percent) {
                     for(
    $count = ($this -> percent); $count <= $percent$count ++) {
                             echo 
    '<script language="javascript" type="text/javascript">';
                             echo 
    'setPercent("'.$percent.'");';
                             echo 
    '</script>';
                             echo 
    "\r\n\r\n";
                             
    flush();
                     }
                     
    $this -> percent $percent;
            }
            
            function 
    writeJS() {
                     echo 
    '<script language="javascript" type="text/javascript">';
                     echo 
    '(document.all) ? per = document.all[\'progress\'] : per = document.getElementById(\'progress\');';
                     echo 
    '(document.all) ? msg = document.all[\'msglabel\'] : msg = document.getElementById(\'msglabel\');';
                     echo 
    'function setPercent(percent) {';
                     echo 
    '        per.innerHTML = "Fortschritt: " + percent + " %";';
                     echo 
    '}';
                     echo 
    'function setMessage(message) {';
                     echo 
    '        msg.innerHTML = message;';
                     echo 
    '}';
                     echo 
    '</script>';
                     echo 
    "\r\n\r\n";
            }
    }
    ?>
    Das ist ersteinmal die Klasse die ich habe - vollgespickt mit JavaScript. Zum testen verwende ich derzeit folgende Syntax:
    PHP-Code:
    <?php
    $progress 
    = new progress;

    echo 
    '<div id="progress">0%</div>';
    echo 
    '<div id="msglabel">Text</div>

    '
    ;
    echo 
    "\r\n\r\n";
    $progress -> writeJS();


    function 
    send($email) {
        global 
    $progress;
        echo 
    "Sende E-Mail an $email ... OK
    "
    ;
        
    $progress->setMessage("Sende E-Mail an $email ...");
        
    sleep(1);
    }

    for (
    $i=1;$i<=100;$i++) {
        if (
    $i==10send('paulmueller@domain.de');
        if (
    $i==20send('lisa@springfield.de');
        if (
    $i==30send('donald@entenhausen.de');
        if (
    $i==40send('marketing@firma.de');
        if (
    $i==50send('dr.peter@arzt.de');
        if (
    $i==60send('schueler@schule.de');
        if (
    $i==70send('lehrer@schule.de');
        if (
    $i==80send('niemand@world.de');
        if (
    $i==90send('xxx@yyy.de');
        
    $progress->setPercent($i);
    }
    ?>
    Normalerweise sollte jedesmal, wenn setPercent() aufgerufen wird, der Inhalt an den Browser gegeben werden (durch flush() ). Nur leider funktioniert das nicht so wie ich moechte, er aktualisiert nur in folgenden Schritten:
    Schritt 1:
    Fortschritt: 20 %
    Sende E-Mail an lisa@springfield.de ...

    Hier fehlt ja schoneinmal der Durchlauf von 0-20%..
    Die naechste Anzeige ist:
    Fortschritt: 43 %
    Sende E-Mail an marketing@firma.de ...

    Fortschritt: 66 %
    Sende E-Mail an schueler@schule.de ...

    Fortschritt: 89 %
    Sende E-Mail an niemand@world.de ...

    Fortschritt: 100 %
    Sende E-Mail an xxx@yyy.de ...
    Folgendes hatte ich auch einmal versucht, um herauszufinden, ob es nur an den (fehlerhaften?) Sleeps liegt:
    PHP-Code:
    <?php
    for ($i=1;$i<=100;$i++) {
        
    sleep(1);
        
    flush();
        if (
    $i==10send('paulmueller@domain.de');
        if (
    $i==20send('lisa@springfield.de');
        if (
    $i==30send('donald@entenhausen.de');
        if (
    $i==40send('marketing@firma.de');
        if (
    $i==50send('dr.peter@arzt.de');
        if (
    $i==60send('schueler@schule.de');
        if (
    $i==70send('lehrer@schule.de');
        if (
    $i==80send('niemand@world.de');
        if (
    $i==90send('xxx@yyy.de');
        
    $progress->setPercent($i);
    }
    ?>
    Jedoch bringt das den gleichen Effekt wie oben beschrieben.
    Wo liegt mein Fehler? Warum laeuft der Prozentzaehler nicht so durch, wie ich es moechte?

  • #2
    Normalerweise sollte jedesmal, wenn setPercent() aufgerufen wird, der Inhalt an den Browser gegeben werden (durch flush() ). Nur leider funktioniert das nicht so wie ich moechte, er aktualisiert nur in folgenden Schritten:
    Im Browser sichtbar oder auch im generierten HTML-Output?

    Kommentar


    • #3
      Wie oben beschrieben, das sehe ich im Browser:
      Schritt 1:
      Fortschritt: 20 %
      Sende E-Mail an lisa@springfield.de ...

      Hier fehlt ja schoneinmal der Durchlauf von 0-20%..
      Die naechste Anzeige ist:
      Fortschritt: 43 %
      Sende E-Mail an marketing@firma.de ...
      Das sehe ich im Browser - die einzelnen Schritte, die NICHT im Browser angezeigt werden, stehen im Quelltext der Seite (rechtsklick..)

      Kommentar


      • #4
        die NICHT im Browser angezeigt werden, stehen im Quelltext der Seite (rechtsklick..)
        Genau, also läuft dein Script im Prinzip reibungslos durch.
        Lediglich die Aktuallisierung im Browser ist nicht wie gewünscht sichtbar.

        Aber das Verhalten liegt nicht am Script sondern ist vom jeweiligen Browser abhängig.

        Was hier evtl. helfen kann ist ein geringer Timeout in JS zu setzen.

        PHP-Code:
                                 echo 'setTimeout(\'setPercent("'.$percent.'")\',20);'
        Allerdings ohne Funktionsgarantie.

        Kommentar

        Lädt...
        X