Gå til innhold

[Løst] PHP / Javascript - Kjøre asynkron prosess


Anbefalte innlegg

Hei.

 

Jeg har satt opp en webside hvor basert på input fra brukeren vil den kjøre en prosess som er veldig tidkrevende - altså vi snakker kjøretid på 1-2 minutter. Jeg ønsker å presentere resultatet fra denne prosessen til brukeren.

 

Siden det tar såpass lang tid går det ikke å bruke exec i PHP da den vil ha en timeout før prosessen er ferdig - i tillegg betyr det at det tar lang tid før brukeren får presentert noe på skjermen. (kunne gjerne stått, vennligst vent mens prosessen kjører).

 

Noen som har noen gode måter på hvordan starte en prosess (i dette tilfellet en java-applikasjon) via PHP eller Javascript som gir resultatet til brukeren når det er ferdig. Som også godtar kjøretider opp i 2 minutter?

Lenke til kommentar
Videoannonse
Annonse

Dette gir meg vel uansett problemer med at scriptet blir å stå 2-3 minutter hvor brukeren har en blank skjerm før han endelig får opp resultatet. Noe som ikke er ønskelig - ønsker at brukeren får opp at dette kan ta noe tid - før dataen så kommer på skjermen.

Lenke til kommentar

Løsningen på å få fullført java-applikasjonen er i linken over dersom PHP-scriptet timer ut (evt. kan du confe php.ini)

 

Løsningen på at brukeren må vente lenge er å gjøre ett Ajax-kall ved hjelp av JS til det PHP-scriptet som skal utføre applikasjonen. Du kan da vise en loadbar eller lignende til brukeren mens PHP-scriptet blir fyrt av i bakgrunnen.

Lenke til kommentar

Før exec call:

 

echo "<p id='searcher'>Please wait.. ".$message." <img src='".$imgurl."' style='vertical-align:middle; padding:7px;'/></p>";
ob_flush();
flush();
echo "<script>element = document.getElementById('searcher');element.parentNode.removeChild(element);</script>\n";

 

Gjerne med en gif fil som $imgurl :)

 

 

Edit: Husk også å sjekke webserver's timeout. Default for apache er vel 60 sekunder uten data iirc.

Edit2: Edit1 herpet CODE blokken.. Fantastisk.

Endret av Terrasque
Lenke til kommentar

:lol: Rareste svarene jeg har hørt. Ser at tråden er satt som løst, men det er da bare å bruke Ajax til dette.

 

Brukeren skriver inn, trykker enter, så fader du inn en animasjon av en loader (google ajax loader gif) og javascript (evt. jQuery om du er kul) sender ajax-request til en enkel PHP-fil som behandler informasjonen og sender svar som json-encodet array tilbake. Enkelt som bare det.

Lenke til kommentar

:lol: Rareste svarene jeg har hørt. Ser at tråden er satt som løst, men det er da bare å bruke Ajax til dette.

 

Brukeren skriver inn, trykker enter, så fader du inn en animasjon av en loader (google ajax loader gif) og javascript (evt. jQuery om du er kul) sender ajax-request til en enkel PHP-fil som behandler informasjonen og sender svar som json-encodet array tilbake. Enkelt som bare det.

 

Ja det var rart... at du skulle gjenta nøyaktig det som står her

Lenke til kommentar

:lol: Rareste svarene jeg har hørt. Ser at tråden er satt som løst, men det er da bare å bruke Ajax til dette.

 

Brukeren skriver inn, trykker enter, så fader du inn en animasjon av en loader (google ajax loader gif) og javascript (evt. jQuery om du er kul) sender ajax-request til en enkel PHP-fil som behandler informasjonen og sender svar som json-encodet array tilbake. Enkelt som bare det.

 

Bare en kuriositet... Hva tjener du med å bruke ajax i dette tilfellet? Om du kjører en page refresh som venter til programmet er ferdig, eller du kjører en long polling ajax request som venter til programmet er ferdig er akkurat samme resultatet, eneste er at ajax er litt mer komplisert.

 

Men, hvis du vil være kul, så har du en ajax call for å starte programmet i bakgrunnen og gi tilbake en id, en måte å vite progress (% fullført til en fil, f.eks), en ajax loop som sjekker hvert X sekund for progress, og en ajax call for å få (eventuelt) resultat.

 

Men hvis det bare er for å kjøre en exec og vente til det er ferdig, spiller det skitt det samme. Eneste grunn for å gå for ajax da er "Jeg vil væra Ql, lissom".

Lenke til kommentar

Koden min er ganske så enkel, den. ob_flush() og flush() vil sende alt som er i bufferen til nettleseren, men vil ikke stoppe videre lasting. Noen sider bruker det for å få web browseren til å starte på å rendere og hente header filer før siden er ferdig generert på server siden.

 

Uansett, den skriver først en <p> block til buffer, flusher den til klient, klienten vil kjøre den delen av koden den har fått, frem til der.. Og fortsette å vente på mer data fra web serveren. Koden skriver så en ren javascript block til bufferen. Når siden er ferdig, og resten av bufferen blir sendt til klienten, så vil browseren execute javascriptet når den får det, og fjerne <p> blokken jeg allerede har sendt.

 

Resultat : En fin "Please wait" melding, gjerne med en animert gif, som forsvinner så fort siden er ferdig å jobbe. Er vel en av de enkleste måtene å gjøre det på.

Lenke til kommentar

Nå har jeg testet koden din, og den fungerer ikke som du forklarer.

 

Jeg fant imidlertid noe kode som fungerer som beskrevet:

 


header('Content-type: multipart/x-mixed-replace;boundary=endofsection');
  print "\n--endofsection\n";
  $pmt = array("-", "\\", "|", "/" );
  for( $i = 0; $i <10; $i ++ ){
   sleep(1);
   print "Content-type: text/plain\n\n";
   print "Part $i\t".$pmt[$i % 4];
   print "--endofsection\n";
   ob_flush();
   flush();
  }
  print "Content-type: text/plain\n\n";
  print "The end\n";
  print "--endofsection--\n";

 

Og med denne koden kan jeg avbryte operasjonen midt i lastingen av siden. Dette kan skape problemer du ikke får ved bruk av Ajax.

 

Hva skjer hvis man avbryter exec() funksjonen før den er ferdig f.eks?

Lenke til kommentar

Problemet med å gjøre det på den måten er jo at det åpner siden for ddos-angrep, eller hvis mange bruker scriptet samtidig kan det fort ta knekken på serveren.

Jeg ville i stedet laget et kø-system hvor du legger jobber i en kø også har du x antall prosesser i bakgrunnen som henter jobber fra køen og lagrer resultatet en plass når jobben er ferdig.

 

Redis er ganske fint å bruke til slikt, det er enkelt å sette opp og bruke.

Lenke til kommentar

Problemet med å gjøre det på den måten er jo at det åpner siden for ddos-angrep, eller hvis mange bruker scriptet samtidig kan det fort ta knekken på serveren.

Jeg ville i stedet laget et kø-system hvor du legger jobber i en kø også har du x antall prosesser i bakgrunnen som henter jobber fra køen og lagrer resultatet en plass når jobben er ferdig.

 

Redis er ganske fint å bruke til slikt, det er enkelt å sette opp og bruke.

Takk for flroslaget, men akkurat det burde ikke være noe problem. Tror aldri det skjer at mer enn 2 brukere kommer til å bruke det samtidig :)
Lenke til kommentar
  • 2 uker senere...

Bare en kuriositet... Hva tjener du med å bruke ajax i dette tilfellet? Om du kjører en page refresh som venter til programmet er ferdig, eller du kjører en long polling ajax request som venter til programmet er ferdig er akkurat samme resultatet, eneste er at ajax er litt mer komplisert.

 

Men, hvis du vil være kul, så har du en ajax call for å starte programmet i bakgrunnen og gi tilbake en id, en måte å vite progress (% fullført til en fil, f.eks), en ajax loop som sjekker hvert X sekund for progress, og en ajax call for å få (eventuelt) resultat.

 

Men hvis det bare er for å kjøre en exec og vente til det er ferdig, spiller det skitt det samme. Eneste grunn for å gå for ajax da er "Jeg vil væra Ql, lissom".

Du tjener alt. Jeg har aldri brukt ob_flush og ser heller ikke poenget med dette. Titter du på større systemer som Wordpress, Modx, Drupal osv kjører disse heller ikke dette. Jeg ønsker å skrive kode som er korrekt og pen.

 

Slik jeg alltid har behandlet PHP er dette et serverscript. Dvs at du åpner en nettside, venter på svar, laster hele svaret og viser det til brukeren. Å lage noe mikk makk som laster litt og litt er sinnsykt knotete.

 

Derfor mener jeg at man tjener alt på å gjøre det med Ajax. Det er pent, det er raskt og ikke vanskeligere enn din løsning, som du hevder.

 

Vi er i det som heter Web2.0 nå, og denne standarden bruker masse Javascript, Ajax og dynamisk html uten for mye refresh og annet dritt.

 

Så det kommer helt an på hvordan nettsider man utvikler. Jeg som lager nettsider som yrke og ønsker å lage ting som er nytt, pent og følger de standardene som finnes, er Ajax i 100% av tilfellene som dette veien å gå.

 

Avventer svar i spenning.

Lenke til kommentar

Du tjener alt. Jeg har aldri brukt ob_flush og ser heller ikke poenget med dette. Titter du på større systemer som Wordpress, Modx, Drupal osv kjører disse heller ikke dette. Jeg ønsker å skrive kode som er korrekt og pen.

 

Slik jeg alltid har behandlet PHP er dette et serverscript. Dvs at du åpner en nettside, venter på svar, laster hele svaret og viser det til brukeren. Å lage noe mikk makk som laster litt og litt er sinnsykt knotete.

 

Derfor mener jeg at man tjener alt på å gjøre det med Ajax. Det er pent, det er raskt og ikke vanskeligere enn din løsning, som du hevder.

 

Vi er i det som heter Web2.0 nå, og denne standarden bruker masse Javascript, Ajax og dynamisk html uten for mye refresh og annet dritt.

 

Så det kommer helt an på hvordan nettsider man utvikler. Jeg som lager nettsider som yrke og ønsker å lage ting som er nytt, pent og følger de standardene som finnes, er Ajax i 100% av tilfellene som dette veien å gå.

 

Ska vi se... Først og fremst flush / ob_flush, Yahoo bruker det, blant annet. Og det er flere artikler som nevner det.

 

Og hvis du virkelig har det synet på PHP, så lurer jeg på hva du har tenkt å kode AJAX server delen i? Siden du møter samme "problemet" ditt der.

 

Og ajax.. Raskt? Whut? Tar samme tiden å kjøre server prosessen uansett. Og pent.. Seriøst mann, du kan få begge metodene til å se ut akkurat som du vil. Skjerpings. Og min løsning krever minimalt med endring i forhold til eksisterende kode. AJAX krever mer endring, og er derfor per definisjon vanskeligere.

 

Hah, web2.0 ... Jepp, kategori "Jeg vil verra Ql" - Use that which gets the job done in a good way. Det å overkomplisere noe bare fordi "det er slik de qle gjør det" (med null forståelse for hvorfor) er bare tull, og bør unngås. du har faktisk ikke gitt ET eneste argument for ajax over min metode, untatt "det er det andre gjør". Tenk litt selv, og ikke løp etter døgnfluer hele tiden. Igjen,.. Skjerpings!

 

Og nå drar du frem "Jeg er profesjonal" kortet.. Vel, kult det. Hva har du laget, da? Jeg jobber også profesjonalt med websider (mest internt tho), i den grad at mitt firma betaler meg penger for å få på plass det de trenger. Blant hobby sider så har jeg blant annet radio-linken i sig'en min, og et lite bilde-vise prosjekt jeg putler med nå og da. Internt på jobben har jeg blant annet et kart system og et søkesystem som er BARE statisk HTML, javascript og jsonp API'er (som jeg også har laget, for den saks skyld ) via AJAX. JS lager og fjerner html elementer, sender forespørsler til server, viser "please wait", får svar, lager relevant HTML i henhold til svarene osv. Cool stuff. Desverre internt, så kan ikke linke til :(

 

Jeg bruker ajax der det er fornuftig, og gir en fordel. Jeg bruker ikke ajax bare for å bruke ajax. Det blir for dumt.

Lenke til kommentar

At Yahoo bruker det bryr jeg meg veldig lite om, er ikke de snart konk uansett? Og jeg har lest artikler om det, men jeg er fortsatt uenig i at det er en god måte å lage nettsider på.

 

Hvordan jeg har tenkt til å kode AJAX-delen? Jeg forstår ikke helt problemet. Legg ved jQuery for å gjøre Ajax-kallet pent og enkelt, la det peke til en PHP-fil med identisk innhold som det du foreslår at skal ligge i fila som blir lastet på load. Det er strengt tatt ikke vanskeligere enn det.

 

Om du prøver å åpne en side som kjører med flush så vil det se ut som om nettsiden laster og laster (venter på alle elementene). Det fremstår derfor som om noe er galt med lastingen, eller at den er utrolig treg. Bruker man Ajax laster nettsiden 100% før den starter neste request.

 

Jeg bruker ikke Ajax fordi de kule gjør det. Jeg gjør det fordi jeg syntes det er korrekt å gjøre det på denne måten. Se hvordan andre nettsider gjør det. Se hvordan nettsider som kjører lengre script og funksjoner gjør det.

 

Jeg er 20 år gammel og har hatt webutvikling som hobby siden jeg gitt på barneskolen. Da jeg var ferdig med videregående fikk jeg 100% stilling i et reklamebyrå fordi jeg viste frem noen av de tingene jeg hadde lagt.

 

Ila det året har jeg utviklet et titalls sider for blant annet SpareBank 1, EiendomsMegler 1, det lokale strøm- og nettselskapet.

 

Se her:

Så jeg har en del erfaring med webutvikling og jeg mener selv at jeg har relativt god peiling på det.

 

Men folk er forskjellige, og jeg er uenig i framgangsmåten din. Sånn er det nok bare.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...