[PHP] Hoe maak je een progress bar ?

Pagina: 1
Acties:
  • 223 views sinds 30-01-2008
  • Reageer

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Hoi,

Op dit moment heb ik dus een loop die nogal wat dingen doet. Ondertussen zou ik aan de gebruiker graag een progress bar tonen. Is hier een makkelijke manier voor?

Er valt weinig te vinden als je hier zoekt op 'progress bar'

Alvast bedankt.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20:58

Janoz

Moderator Devschuur®

!litemod

nee, hier is geen makkelijke manier voor. Je moet beseffen dat je pagina op de server wordt opgemaakt en vervolgens naar de client wordt gestuurd. Er is dus niet echt een makkelijke vorm van interactie tussen beiden. Er zijn wel workarounds, maar echt net/makkelijk zijn deze niet.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Op de een of andere manier zou je de pagina op de client om de 5 seconden of zo moeten kunnen updaten.
Alleen loopt je script dan waarschijnlijk niet meer of stopt ermee.

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

aan het einde van een loop een echo "|"; en flush(); - maar dat werkt niet in alle browsers en niet onder alle omstandigheden, je maakt dan gebruik van de 'progressive' rendering van de browser en dat is lastig te beinvloeden bij complexe pages.

Klaar voor een nieuwe uitdaging.


  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 22:11

TheDane

1.618

^
|

[edit]chem was me wel wat voor, wat hij zegt staat hieronder (8>

misschien kun je hier wat mee ... is niet helemaal 'tzelfde, maar misschien kun je in de loop je dingetjes doen

  • _.Luke._
  • Registratie: September 2001
  • Laatst online: 26-07-2021
Hmmm als je het nu een beetje omslachtig aanpakt...

Je laat je pagina in een DIVJE laden die je nog ff onzichtbaar laat...
Dan zet je in tussen je php code stukkies Javascript die een plaatje ergens anders op de pagina "aanzet".
gewoon
PHP:
1
<?phpstatement1echo "<SCRIPT>document.plaatje1.src='plaatje1'</SCRIPT>";phpstatement2echo "<SCRIPT>document.plaatje2.src='plaatje2'</SCRIPT>";?>

Zet in eerste instantie wat transparante gifjes op de plaats waar je de scrollbalk wilt neerzetten.
en pas wanneer ie dat php scriptje uitvoert gaat ie de verschillende transparante gifjes vervangen door balkjes die achter elkaar staan oid...

damn dis een vaag verhaal maar ik hoop dat je het begrijpt...
enne hopelijk werkt het ook... :+

Trying is the first step towards faillure...


Verwijderd

Op donderdag 25 april 2002 18:20 schreef _.Luke._ het volgende:
PHP:
1
<?phpstatement1;echo "<SCRIPT>document.plaatje1.src='plaatje1'</SCRIPT>";phpstatement2;echo "<SCRIPT>document.plaatje2.src='plaatje2'</SCRIPT>";?>
Doe naar iedere echo een flush(); verder eerst ff dit doen:
PHP:
1
<?//Vul de buffer van de browser (HEEL VIES)for($i = 0; $i <300;$i++)   echo " ";flush();?>

Dit zorgt ervoor dat de buffer van je browser wordt gevult en hij ook daat werkelijk iedere volgende flush weer geeft, als je eerst meer dan 300 karakters aan html echo-t is dit niet nodig..

Verder zet er _geen_ tabel omheen die je pas na alle state-ments afmaakt, dit zorgd ervoor dat de tabel pas wordt weergegeven als de tabel is afgesloten..

  • red_indian
  • Registratie: Maart 2000
  • Laatst online: 24-06 16:43

red_indian

 Smokin' Suckz B!

Op dit moment heb ik dus een loop die nogal wat dingen doet.
'dingen' impliceert meer dan 1 taak? misschien kun je na iedere taak een update doen mbv een switch case?
PHP:
1
<?switch ($taak ){  case: 1    doe_taak_1();    echo "taak 1/5 voltooid";    echo "<SCRIPT>document.location.href='<?=$PHP_SELF ?>'?taak=2</SCRIPT>";    break;  case: 2    doe_taak_2();    echo "taak 2/5 voltooid";    echo "<SCRIPT>document.location.href='<?=$PHP_SELF ?>'?taak=3</SCRIPT>";    break;etc...}?>

zoiets dus... en dan natuurlijk met wrede gfx ;)

dit zou ook in een loop kunnen. stel je loopt van 1 to 100, dan laat je om de 10 ff 'stoppen' en dan weer verder gaan.

tis niet echt elegant, maar het zou kunnen werken.

Need a cuesheet/tracklisting? (meer dan 500.000 online)


  • eborn
  • Registratie: April 2000
  • Laatst online: 08-09 12:50
Ik gebruiker wel eens de volgende oplossing bij bijv. uploaden: zodra de gebruiker op de submitbutton klikt wordt deze disabled en wordt er in een divje onder de button een 'Even geduld aub' tekst gezet.

Niet helemaal een progress bar, maar misschien komt het nog van pas ;)

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Bedankt _.Luke._ dat javascript idee is wel leuk. En simpel denk ik.
Die flush kende ik ook nog niet. Dus nu moet het wel lukken.
Wat er gebeurd in die while is dat er nieuwsbrieven aan leden verstuurd worden.
In de loop wordt dan nog de naam in de mail gezet van de persoon die em krijgt en wordt er of html of tekst mail gestuurd.
Dit is een backoffice feature dus wilde ik er een soort progress bar bij hebben.

Voor de wrede graphics moet ik mijn collega even aankijken :)

Als ik wat moois heb post ik em wel.

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Jammer genoeg krijg ik dat niet aan de praat. IE 6 wil niks van flush weten.
De pagina wordt echt pas getoond wanneer alle gegevens geschreven zijn.

Duz heb ik een popup window gemaakt met daarin de progressbar.
In mijn loop schrijf ik steeds een regel weg die steeds dezelfde javascript functie aanroept maar dan met een steeds hoger getal als parameter.
Dan schrijf ik met die functie steeds opnieuw data in dat pop-up window. En dat werkt heel erg mooi.

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Op zaterdag 27 april 2002 12:03 schreef Frijns.Net het volgende:
Jammer genoeg krijg ik dat niet aan de praat. IE 6 wil niks van flush weten.
De pagina wordt echt pas getoond wanneer alle gegevens geschreven zijn.
Heb je het ook geprobeerd op de manier van TimD. Dus eerst 300 karakters wegschrijven en dan pas gaan flushen..

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 04-05 00:03

Engineer

Software

.

[ Voor 98% gewijzigd door Engineer op 13-10-2018 11:42 ]


  • AntonicKnight
  • Registratie: Juni 2001
  • Laatst online: 01-09-2025
Nog even over dat IE6 geen Flush zou ondersteunen: ik heb het es geprobeerd met ASP.NET (ik weet natuurlijk wel dat het geen PHP is maar toch..) met deze code:
code:
1
2
3
4
5
6
7
8
9
<%
Dim i As System.Int64
For i = 0 To 100000
    If i.ToString().EndsWith("9999") Then
        Response.Write("______<br>")
        Response.Flush()
    End If
Next
%>

En nu zie je langzaam de lijntjes onder elkaar verschijnen dus IE6 ondersteunt WEL Flushes.

MacBook Pro (mid-2010) || 2.4 GHz Core 2 Duo || 2x2GB || 64 GB OCZ Vertex + 640GB Samsung HM641JI || Eizo S2232WE-BK || Bose Companion II


  • ebas
  • Registratie: Maart 2001
  • Laatst online: 20-04-2017

ebas

 

Het is wel zo dat alle browsers pas de inhoud van een tabel laten zien na een </table>
Dus als je je progress barretje buiten een tabel laat zien, moet het goed gaan.

Ik zou het zelf ook met een divje oplossen, daarin een progressbar, en een form met een textveld erin. Daar kun je dan percentage inzetten, met eventueel getallen achter de komma (23,45%) als je dingen doet die echt heel lang duren.

Toch denk ik niet dat het goed stabiel is als je iets doet met een php wat lang duurt, want wat gebeurd er als de client de verbinding sluit? Stopt dan je php midden in het proces? (weet ik niet hoor). Je kan dus beter met een perl script die helemaal serverside draait, en een percentage in een tempfiletje dumpt werken. Kun je gewoon pagina refreshen en daarmee kijken hoe het ermee staat.

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 08-09 22:01
Die flush en die spaties heb ik erin gezet maar het helpt niet veel. Misschien meer spaties gebruiken of andere gekke dingen doen.
Mijn popup werkt nu en doet het realtime die laat ik er dus voorlopig maar even instaan.

Een ander idee is zoals hier ook genoemd met een file werken die de informatie bevat en die met een javascript steeds refreshed wordt.
Zo zou je het ook in de DB kunnen zetten in een kleine tabel en in een window steeds opnieuw kunnen refreshen.
Zo zijn ze onafhankelijk van elkaar.

Dat gedoe met een <div> is dhtml neem ik aan. Daar heb ik eigenlijk nog geen kaas van gegeten dus ik zou niet precies weten hoe ik dat moet gaan maken. Als ik tijd heb ga ik me wel eens verdiepen in DHTML.
Pagina: 1