Output van 'echo' altijd op dezelfde plaats?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Eric Verboven

Eric Verboven

17/05/2020 12:49:57
Quote Anchor link
Ik doe een bewerking (in PHP) op ongeveer 50.000 dossiers, een operatie die heel wat tijd in beslag neemt. De gebruiker moet te zien krijgen bij welk dossier (zeg maar: de naam van het dossier) het hele proces zich bevindt. Het lastige, en mijn vraag: hoe krijg ik die boodschap altijd op dezelfde plaats op het scherm? Iets als dit:


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$teller
= 0;
while ($teller < 50000) {
      $naam = get_naam_dossier($teller);
      echo "Ik bevind me nu bij " . $naam;
      // deze boodschap zou altijd op dezelfde plaats / regel op het scherm moeten komen
      $x = doe_geweldige_dingen_op_dossier($teller);
      $teller++;
}

?>



Heeft iemand hier een kort werkend voorbeeldje van? Bij voorkeur met PHP en CSS alleen. Maar misschien is javascript onvermijdelijk?

Ik kijk uit naar een oplossing!
Gewijzigd op 17/05/2020 13:48:24 door Eric Verboven
 
PHP hulp

PHP hulp

08/11/2024 20:18:31
 
Thomas van den Heuvel

Thomas van den Heuvel

17/05/2020 13:15:58
Quote Anchor link
Al geGoogled op "php real time progress bar"?
 
- Ariën  -
Beheerder

- Ariën -

17/05/2020 13:24:02
Quote Anchor link
Op welke manier vind die bewerking plaats?
Als achtergrondproces? Of moet iemand de browser continu openhouden?

Dat laatste hoop ik overigens niet. Als het een achtergrondproces is, dan kan dat proces ook een tellertje bijhouden. En dan kan jij met een AJAX-request elke paar seconden zien hoeveel er verwerkt zijn.
 
Rob Doemaarwat

Rob Doemaarwat

17/05/2020 13:40:27
Quote Anchor link
Als je het vanuit de command line doet kun je een "carriage return" ("\r") gebruiken om weer terug te gaan naar het begin van de regel.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

while($busy){
  $record = ...
  print(substr("\rCurrently working on {record['name']}   ",0,79));
    //wat extra spaties om "oude data" te wissen; en een maximum van 79 karakters om te voorkomen
    //dat ie naar de volgende regel "over flowt" (of je moet je command line scherm breder maken,
    //maar 80 karakters is de standaard onder Windows).

  //doe ding met $record

}
 
Eric Verboven

Eric Verboven

20/05/2020 12:31:49
Quote Anchor link
Als je hier een probleem 'indient', en je stuit later zelf op de oplossing, is het wel zo prettig om dat even aan de flock mee te delen, toch. Dus, hieronder vind je een eenvoudig vooruitgangsscriptje, alleen in PHP, geen gedoe met Ajax of Javascript.
Het programmaatje toont nu gefaseerd een array van termen, met telkens 1 seconde pauze - volstrekt nutteloos, alleen om te laten zien dat het werkt. Maar uiteraard kan je de functie ook aanspreken na een while of foreach vol geweldige maar tijdrovende programmacode.
Geen styling, geen plaatsing: alles wordt gewoon linksboven op het scherm getoond, zwart op wit.
Ere wie ere toekomt: onderstaande code is een aanpassing van het origineel
op https://stackoverflow.com/questions/7049303/show-progress-for-long-running-php-script
Zoek in de lange boodschappenreeks ergens halfweg naar "I'll put this here as a reference for anyone searching"

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

$array1
= array("aap", "noot", "mies", "relativiteit", "België", "Luxemburg", "Zimbabwe","put", "d");
$current = 0;
foreach ($array1 as $element) {
    outputProgress($array1[$current], count($array1));
    $current++;
}


echo "<br>Ziezo, klaar.";

/**
 * Met de $huidig_getal parameter gebeurt nu niks, maar je zou er de waarde van een counter in kunnen meegeven, of een min of meer
 * grafische string voor een voortgangsaanduiding.
 */


function outputProgress($huidige_term, $huidig_getal) {
    /* De 100 als z-index en als aantal spaties zijn volstrekt willekeurig */
    /* De eerste echo beeldt 100 spaties af, om de toonregel mooi leeg te maken. Als je dat niet doet, blijven er restanten van de
    /* vorige run. */

    
    echo "<span style='position: absolute; z-index: 100; background: #FFF;'>" . str_repeat('&nbsp;', 100) . "</span>";
    echo "<span style='position: absolute; z-index: 100; background: #FFF;'>" . $huidige_term . "</span>";
    
    myFlush();
    sleep(1);
}


/**
 * Flush output buffer
 */

function myFlush() {
    echo(str_repeat(' ', 256));
    if (@ob_get_contents()) {
        @
ob_end_flush();
    }

    flush();
}


?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.