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:


<?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!
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.
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

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
}
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"

<?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();
}

?>

Reageren