PHP Progressbar Problem

facebraker

New Member
Hallo,

ich muss im Vorhinein sagen, dass ich keine Ahnung von PHP habe, ich kann programmieren, d.h. grundlegene Strukturen sind mir nicht fremd bloß an der PHP Syntax hapert es, wobei ich sagen muss es erinnert mich schwer an C.

Mein Problem:

Ich möchte einen Forschrittsbalken darstellen für eine Datensicherung

Die Kontrolle der Datensicherung ist einfach wie genial, ich sichere die Daten per tar aufs Band und schreibe die gesicherten Dateien Zeile für Zeile in die Datei gesamt.log

Nach der Sicherung, mache ich ein Prüflesen des Bandes mit tar und lasse wieder die angezeigten Dateien in eine Datei schreiben check.log

Stimmt die Anzahl der Dateien, ist die Sicherung sauber gelaufen.

Da die Sicherung für mich eine Blackbox ist, möchte ich wissen wie weit die Sicherung ist.
Ich weiß ja noch vom Vortag wieviel Dateien ich gesichert habe, da nehme ich an, dass es ca. die 100% sind.

Dann weiß ich, wie weit er gerade mit der Sicherung ist : Anzahl der Dateinen in der gesamt.log (die check.log lassen wir mal aussen vor)

Daraus weiß ich mit wieviel Prozent er fertig ist (Teil/Gesamt*100%)

Nun möchte ich das in einen PHP Skript umsetzen damit ich es Online nachgucken kann.

Das Skript soll solange laufen wie die Datein/tmp/dasi.run existiert, gewissermaßen ein endloskript.

in der While-Schleife habe ich ein sleep eingebaut.
Bei jeden Durchgang soll überprüft werden, wieviele Zeilen (Anzahl) aktuell in der gesamt.log sind, dann die Prozent ausrechnen z.B. 25% dann soll der Progressbar 25 von 100 Einheiten ansteigen. Das mache ich mit der Zählschleife, weil ich ja 25mal increasen muss.

Bloss die Sch**** geht nicht, mache ich einen Denkfehler?

Hier der Code:

Code:
<?php
        require_once 'ProgressBar.class.php';
        $bar = new ProgressBar();
        $bar->setMessage('loading ...');
        $bar->setAutohide(true);
        $bar->setSleepOnFinish(1);
        //$bar->setForegroundColor('#ff0000');

        $elements = 100; //total number of elements to process
     #Die Gesamtanzahl = 100%   
     $bar->initialize($elements);

        #Datei mit den Zeilen die sich während der Sicherung erhöht      
        $teil = file("/tmp/check.log");
        $gesamt = file("/tmp/gesamt.log");
        #die Gesamt Dateien mal zum testen auf 100 gesetzt
        $gesamt_count= 100;
        #$gesamt_count= count($gesamt);
       #zählen der Dateien        
       $teil_count=count($teil);
       #ausrechnen der Prozent        
       $percent=$teil_count/$gesamt_count*100;
       #echo "Fortschritt der Datensicherung $percent Prozent \n";
        #echo "\n";
        #echo count($teil);
        #echo "\n";
        #echo $php_errormsg;
        $alt=0

        #führe so lange aus, wie die Datei existiert
        while (file_exists('/tmp/dasi.run'))
        {
           #ermittle die neue Anzahl        
           $teil_count=count($teil);
           #rechne die neuen Prozente aus
           $percent=$teil_count/$gesamt_count*$hundert;
           $anzahl=$percent-$alt;
           $alt=$percent;
           #warte
           sleep(1);

        #führe das so oft aus, wie es neue Prozente sind
        for($i=0;$i<$percent;$i++){

                #echo "Fortschritt der Datensicherung $percent Prozent \n";

                #sleep(5); // simulate a time consuming process
                #erhöhe den balken
                $bar->increase(); //calls the bar with every processed element

                if($i==1){
                        $bar->setMessage('Datensicherung  ...');
                        $bar->setForegroundColor('#3F41FF');
                        }
        }
  #setze Anzahl auf Null 
  $teil_count=0;
  $anzahl=0;
        }
?>

Sorry für die sch*** Formatierung ...

Hoffe auf Hilfe
 
Last edited by a moderator:
Hi,

jetzt läuft es erstmal, ich habe den Code nochmal geändert.
Ich hatte einen Denkfehler drin, ich muss ja bei der Zählschleife mit der Diffenrenz rechnen.

Aber irgendie funktioniert die Endloschleife nicht, die while-Schleife wird nur 1 mal abgearbeitet.
Ich habe mal hinter der While-Schleife ein Echo eingebaut, aber das wird auch nicht aufgerufen, als ob die While-Schleife steht???

Hat jemand eine Idee?

Gruss Alex
 
Hi Ben,

ich war paar Sekunden schneller ;-)
siehe oben.

Ich möchte das ja so haben, dass, wenn sich die datei check.log erhöht, das der Balken (mit max. 1sekunde wartezeit) sich erhöht.

Aber ich muss z.Zt. die Seite immer neu laden um die Änderungen zu sehen :-(

Klar könnte ich das mit HTML realisieren das die Seite autom. geladen wird, aber das ist frickelei und häßlich ;-)

Gruss ALex
 
Du willst das Skript solange laufen lassen bis er irgendwann die 100% erreicht?

Ich fürchte da wirst du in die max-runtime deiner PHP-Instanz laufen. Du kannst es eher noch via AJAX machen.

Die Datensicherung dauert ja keine 30 Sekunden nehme ich an (also mein Bandlaufwerk braucht länger :)). Da wirst du um einen skriptseitigen Refresh nicht drum rum kommen.

Ausser ich habe dich nicht verstanden... :)
 
Hi Ben,

jetzt wo du es sagst und ich ein bisschen über den Tellerrand der Testumgebung geschaut habe, ist es unsinnig.

Meine Datensicherung dauert 5:30 Stunden + 3Stunden prüflesen.

Ich sitze ja nicht die 5:30h vor dem Bildschirm und gucke zu wie sich der Balken erhöht (zumal die dasi von 20:30Uhr - ca.5Uhr läuft).

Wenn dann gucke ich mal drauf, eventuell aktualisiere ich und das reicht.

Danke Dir für den Denkanstoß!!!:D

Gruss Alex
 
Back
Top