Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PHP + Ajax + progress meter

12 views
Skip to first unread message

Martin

unread,
Apr 26, 2012, 4:21:58 AM4/26/12
to
Hej,

Er det muligt at lave en progress bar ved ajax kald.

Lad mig give et eksempel, min PHP gør som sådan ikke noget men der er 4
funktioner som udskriver en tekst.

// ajax.php
<?php
class Dosomething {

public function __construct() {
echo self::test1();
sleep(5);
echo self::test2();
sleep(5);
echo self::test3();
sleep(5);
echo self::test4();
}

static private function test1() { echo 25; }
static private function test1() { echo 50; }
static private function test1() { echo 75; }
static private function test1() { echo 100; }

}

new Dosomething;


Nu vil jeg så gerne have mit ajax til ikke at stoppe med at lytte indtil
det får 100 retur - er det muligt på en eller anden måde?

Birger Sørensen

unread,
Apr 26, 2012, 5:18:19 AM4/26/12
to
Martin:
Umiddelbart nej - hvis jeg forstår dig rigtigt.
Et AJAX kald er kun eet kald. Det venter til kommunikationen er slut -
og det er den ikke før det sidste er returneret fra PHP.
Så du må enten dele dit kald i flere små trin, eller alternativt lave
et andet kald (og en ekstre funktion i PHP), der kan spørge Dosomething
objektet hvor langt det er kommet.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://skippersevent.dk


Martin

unread,
Apr 26, 2012, 5:48:25 AM4/26/12
to
Det var også det som jeg nogenlunde er kommet frem til, så jeg må skrive
min klasse om.

Fandt forresten denne
http://www.redips.net/javascript/ajax-progress-bar/

Birger Sørensen

unread,
Apr 26, 2012, 6:48:50 AM4/26/12
to
Martin forklarede den 4/26/2012:
8X
Vist umiddelbart lidt mere kompliceret end det behøver være.
Men da en udmærket artikel.

Michael Rasmussen

unread,
Apr 26, 2012, 7:17:35 AM4/26/12
to
On Thu, 26 Apr 2012 12:48:50 +0200
Birger Sørensen <s...@bbsorensen.com> wrote:

>
> Vist umiddelbart lidt mere kompliceret end det behøver være.
> Men da en udmærket artikel.
>
Hvorfor ikke anvende noget eksisterende?
http://jqueryui.com/demos/progressbar/

jQuery er rimeligt simpelt at anvende, når først 10 øren er faldet:-)

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.

Martin

unread,
Apr 26, 2012, 7:22:38 AM4/26/12
to
On 26-04-2012 13:17, Michael Rasmussen wrote:
> On Thu, 26 Apr 2012 12:48:50 +0200
> Birger Sørensen<s...@bbsorensen.com> wrote:
>
>>
>> Vist umiddelbart lidt mere kompliceret end det behøver være.
>> Men da en udmærket artikel.
>>
> Hvorfor ikke anvende noget eksisterende?
> http://jqueryui.com/demos/progressbar/
>
> jQuery er rimeligt simpelt at anvende, når først 10 øren er faldet:-)

Det er ikke så meget javascript delen, den er der rimelig styr på - det
er nu mere PHP delen

Anders Wegge Keller

unread,
Apr 26, 2012, 8:16:21 AM4/26/12
to
Martin <martinprikaarhofsnabelagmailprikcom> writes:

> Nu vil jeg så gerne have mit ajax til ikke at stoppe med at lytte
> indtil det får 100 retur - er det muligt på en eller anden måde?

Hvordan ser dit javascript ud? Din php-kode giver en syntaxfejl, så
jeg går ud fra at det er noget andet der virkelig kører, men du burde
ikke få en readyState 4, før serveren har lukket forbindelsen,
dvs. når php-delen er færdig med at køre.

--
/Wegge

Leder efter redundant peering af dk.*,linux.debian.*

Jonathan Stein

unread,
Apr 26, 2012, 11:36:22 AM4/26/12
to
Den 26-04-2012 10:21, Martin skrev:

> Nu vil jeg så gerne have mit ajax til ikke at stoppe med at lytte indtil
> det får 100 retur - er det muligt på en eller anden måde?

Det har ikke så meget med PHP at gøre, så jeg har ændret FUT til
clientside gruppen.

Men overordnet skal du:

- Lave dit request asynkront.

- Når dit objekt skifter readyState til 3 (LOADING), skal du begynde at
kigge på responseText. Brug "onreadystatechange" til at detektere når
objektet skifter state. Brug setTimeout til at holde pause.

responseText indeholder hele det modtagne svar, så for hver timeout,
skal du se, om den er ændret.

Du bør nok holde øje med, om readyState ændrer sig, så dit script ikke
bliver ved med at vente på "100", hvis der opstår en fejl.

Alternativt skal du jævnligt lave et kald til serveren for at høre hvor
langt, den er nået.

M.v.h.

Jonathan

Birger Sørensen

unread,
Apr 26, 2012, 11:37:41 AM4/26/12
to
Fᅵlgende er skrevet af Michael Rasmussen:
> On Thu, 26 Apr 2012 12:48:50 +0200
> Birger Sᅵrensen <s...@bbsorensen.com> wrote:
>
>>
>> Vist umiddelbart lidt mere kompliceret end det behᅵver vᅵre.
>> Men da en udmᅵrket artikel.
>>
> Hvorfor ikke anvende noget eksisterende?
> http://jqueryui.com/demos/progressbar/
>
> jQuery er rimeligt simpelt at anvende, nᅵr fᅵrst 10 ᅵren er faldet:-)

Og de ca. 30 liniers kode der skal til at bruge AJAX, behᅵver ikke
fylde 132Kb overhead, hvis man ikke har noget andet at bruge jQuery
til.

Anders Wegge Keller

unread,
Apr 26, 2012, 1:06:45 PM4/26/12
to
Jonathan Stein <jst...@image.dk> writes:

> Den 26-04-2012 10:21, Martin skrev:
>
> > Nu vil jeg så gerne have mit ajax til ikke at stoppe med at lytte indtil
> > det får 100 retur - er det muligt på en eller anden måde?
>
> Det har ikke så meget med PHP at gøre, så jeg har ændret FUT til
> clientside gruppen.

Der er lige en enkelt server-side betragtning. I Chrome bliver
responseText kun opdateret løbende, hvis Content-Type er sat til noget
andet end text/html. Jeg skal ikke kunne sige om der er andre værdier
der også giver ballade, men det virker ihvertfald fortriligt, hvis man
sætter den til application/x-text:

header("Content-Type: application/x-text");


> Men overordnet skal du:
>
> - Lave dit request asynkront.
>
> - Når dit objekt skifter readyState til 3 (LOADING), skal du begynde
> at kigge på responseText. Brug "onreadystatechange" til at detektere
> når objektet skifter state. Brug setTimeout til at holde pause.

Er det nødvendigt? Hvis al processering foregår fra onreadystate(),
skal man ikke gøre andet end at læne sig tilbage og vente.

Birger Sørensen

unread,
Apr 26, 2012, 1:24:11 PM4/26/12
to
Anders Wegge Keller skrev:
W3C's dokumentation
http://www.w3.org/TR/XMLHttpRequest/
er stadig kun et draft, så man skla nok ikke forvente at browserne
reagerer ens.
Så ved redaySTate alt andet end 4, ville jeg ikke regne med data -
uanset om de læses fra responseXML, responseText eller responseBody.

Har også betænkeligheder ved at bruge onreadystatechange til en
progressbar.

Det rigtige for spørgeren må stadig være, at udstyre det PHP object der
udfører opgaven, med en funktion der kan fortælle hvor langt det er
nået, og så læse den med et (andet) AJAX-kald.

Andreas Andersen

unread,
Apr 27, 2012, 9:06:35 AM4/27/12
to
Den 26-04-2012 17:37, Birger Sørensen skrev:
> Og de ca. 30 liniers kode der skal til at bruge AJAX, behøver ikke fylde
> 132Kb overhead, hvis man ikke har noget andet at bruge jQuery til.

92Kb og det bliver jo cachet.

Jeg vil også gerne anbefale jQuery, det er sådan en lettelse i forhold
til almindeligt Javascript. Det fungerer bare uden vrøvl.

--
Andreas

Andreas Andersen

unread,
Apr 27, 2012, 9:09:06 AM4/27/12
to
Den 27-04-2012 15:06, Andreas Andersen skrev:
> Den 26-04-2012 17:37, Birger Sørensen skrev:
>> Og de ca. 30 liniers kode der skal til at bruge AJAX, behøver ikke fylde
>> 132Kb overhead, hvis man ikke har noget andet at bruge jQuery til.
>
> 92Kb og det bliver jo cachet.

Du henviste måske til en komponent, der bygger oven på jQuery.

--
Andreas

Jonathan Stein

unread,
Apr 27, 2012, 12:44:41 PM4/27/12
to
Den 26-04-2012 19:06, Anders Wegge Keller skrev:

>> - Når dit objekt skifter readyState til 3 (LOADING), skal du begynde
>> at kigge på responseText. Brug "onreadystatechange" til at detektere
>> når objektet skifter state. Brug setTimeout til at holde pause.
>
> Er det nødvendigt? Hvis al processering foregår fra onreadystate(),
> skal man ikke gøre andet end at læne sig tilbage og vente.

Om setTimeout er nødvendig?

Objektet skifter jo ikke readyState før svaret er komplet, så hvis vi
ikke laver en timeout, skal vi lave et loop, der konstant ser, om
responseText er ændret i forhold til den hidtil modtagne tekst - og
sådan et loop uden timeout plejer at suge al kraft ud af browseren.

Jeg tror desværre ikke det kan gøres simplere.

M.v.h.

Jonathan

Birger Sørensen

unread,
Apr 27, 2012, 3:48:01 PM4/27/12
to
Andreas Andersen kom med denne ide:
Nej. Jeg henviste til at bruge "toolbokse", med en farligt masse
indhold, man ikke har brug for, for at slippe for at skrive 30 liniers
kode selv.
Javascript kører for øvrigt fortrinligt, hvis det er programmeret
ordentligt.

Birger Sørensen

unread,
Apr 27, 2012, 3:53:08 PM4/27/12
to
Følgende er skrevet af Jonathan Stein:
Objektet kalder onreadystate, hver gang der er modtaget noget fra
serveren - og så undervejs i funktionaliteten (hvis der sendes noget),
og også selvom svaret ikke er komplet.
Så en timeout er inderligt overflødig, hvis man lader readystate=3
opdatere progressbaren...

Andreas Andersen

unread,
Apr 28, 2012, 12:24:13 AM4/28/12
to
Den 27-04-2012 21:48, Birger Sørensen skrev:
> Nej. Jeg henviste til at bruge "toolbokse", med en farligt masse
> indhold, man ikke har brug for, for at slippe for at skrive 30 liniers
> kode selv.
> Javascript kører for øvrigt fortrinligt, hvis det er programmeret
> ordentligt.

At programmere Javascript "ordentligt" er bare ikke ret interessant for
ret mange med de forskellige browserhacks, man skal sætte sig ind i.
Hvis man gerne vil have produceret noget, der bare virker, i en fart er
jQuery vejen frem, og de 92kb i overhead er en meget billig pris at betale.

Men det er jo en smagssag.

--
Andreas

Birger Sørensen

unread,
Apr 28, 2012, 12:52:54 AM4/28/12
to
Andreas Andersen udtrykte præcist:
8X
> Hvis man
> gerne vil have produceret noget, der bare virker, i en fart er jQuery vejen
> frem, og de 92kb i overhead er en meget billig pris at betale.
>
> Men det er jo en smagssag.

Som man ser på det.
Det er dig der har travlt og har den nemme løsning - det er dine
besøgende der betaler.
Det minder rigtig meget om spam...

Andreas Andersen

unread,
Apr 28, 2012, 1:57:58 AM4/28/12
to
Den 28-04-2012 06:52, Birger Sørensen skrev:
> Andreas Andersen udtrykte præcist:
> 8X
>> Hvis man gerne vil have produceret noget, der bare virker, i en fart
>> er jQuery vejen frem, og de 92kb i overhead er en meget billig pris at
>> betale.
>>
>> Men det er jo en smagssag.
>
> Som man ser på det.
> Det er dig der har travlt og har den nemme løsning - det er dine
> besøgende der betaler.
> Det minder rigtig meget om spam...

Minimerer du alt dit output til browseren? Fjerner al overflødig
whitespace og skriver HTML-koden så den fylder mindst frem for at være
mest overskuelig? Kun div'er og class'er med en-bogstavs-navne f.eks.?
Eller du sørger måske for at din webserver sender HTML zippet?

Hvis plads skulle være et altoverskyggende hensyn, skulle nogen finde en
måde at gøre HTML langt mindre, det er jo en håbløst redundant
kommunikationsform.

Javascript skrevet med jQuery fylder i øvrigt langt mindre end
Javascript uden, så når man skriver mere Javascript vil det samlede
pladsforbrug konvergere mod det samme.

--
Andreas

Birger Sørensen

unread,
Apr 28, 2012, 5:33:49 AM4/28/12
to
Andreas Andersen har bragt dette til os:
8X
> Javascript skrevet med jQuery fylder i øvrigt langt mindre end Javascript
> uden, så når man skriver mere Javascript vil det samlede pladsforbrug
> konvergere mod det samme.

Uanset hvad jeg ellers gør, sender jeg ikke 92Kb, som jeg godt ved ikke
skal bruges til noget, for at slippe for selv at skrive 30 liniers kode
selv.

Birger.

Leif Neland

unread,
Apr 28, 2012, 7:17:52 AM4/28/12
to
Den 28-04-2012 11:33, Birger Sørensen skrev:
> Andreas Andersen har bragt dette til os:
> 8X
>> Javascript skrevet med jQuery fylder i øvrigt langt mindre end
>> Javascript uden, så når man skriver mere Javascript vil det samlede
>> pladsforbrug konvergere mod det samme.
>
> Uanset hvad jeg ellers gør, sender jeg ikke 92Kb, som jeg godt ved ikke
> skal bruges til noget, for at slippe for selv at skrive 30 liniers kode
> selv.
>

Hvis du loader jQuery fra google, så har brugeren det højst sandsynligt
i forvejen i sin cache.

Leif

Birger Sørensen

unread,
Apr 28, 2012, 9:37:10 AM4/28/12
to
Leif Neland formulerede spørgsmålet:
Undtagen "de små skærme" og andre der kører med små mængder RAM.
Tror det er mere sandsynligt at det ryger ud af cache, når brugeren
forlader sitet, så det kun kan hjælpe på hastighed og båndbredde ved
reload af siden.

Birger

Philip Nunnegaard

unread,
Apr 28, 2012, 10:45:13 AM4/28/12
to
Birger Sørensen skrev:

> Undtagen "de små skærme" og andre der kører med små mængder RAM.
> Tror det er mere sandsynligt at det ryger ud af cache, når brugeren
> forlader sitet, så det kun kan hjælpe på hastighed og båndbredde ved
> reload af siden.

Det er vel også kun Googles version af filen der er cached. Min browser
kan jo ikke vide om indholdet af domæne1.invalid/jquery.js indeholder
præcis det samme som domæne2.invalid/jquery.js.

Ellers kunne det give nogle sjove visninger af index.php på forskellige
hjemmesider.


--
Philip

Andreas Andersen

unread,
Apr 28, 2012, 10:52:06 AM4/28/12
to
Man henviser til Googles version fra sin egen side, og den er så i
browserens cache til næste side, der måtte have brug for den.

<script language="javascript" type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" />

--
Andreas

Birger Sørensen

unread,
Apr 28, 2012, 11:00:16 AM4/28/12
to
Andreas Andersen tastede følgende:
Og på den måde, kan man ikke blot spilde sine besøgendes bandwidth, man
kan også fylderes cache med op til flere versioner af det samme - som
ikke skal bruges til noget... ;-)

Philip Nunnegaard

unread,
Apr 28, 2012, 2:51:22 PM4/28/12
to
Den 28-04-2012 17:00, Birger Sørensen skrev:

>> <script language="javascript" type="text/javascript"
>> src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" />
>
> Og på den måde, kan man ikke blot spilde sine besøgendes bandwidth, man
> kan også fylderes cache med op til flere versioner af det samme - som
> ikke skal bruges til noget... ;-)

Næh. Hvis alle linker til Googles version fra deres sider, må det vel
være den samme fil der caches en gang for alle?

Selv undrer jeg mig mere over hvad language-attributten laver. Jeg
troede at den var udgået og ikke mindst overflødig når man nu også har
type-attributten.

Skal lige indrømme at jeg har lavet noget lignende makværk med css'en på
et par af mine sider. En stor css-fil på over 50 kb som med fordel kunne
splittes op i flere små bidder som kun blev hentet ind på de undersider
hvor der var brug for det.

--
Philip

Andreas Andersen

unread,
Apr 28, 2012, 3:12:53 PM4/28/12
to
Den 28-04-2012 20:51, Philip Nunnegaard skrev:
> Selv undrer jeg mig mere over hvad language-attributten laver. Jeg
> troede at den var udgået og ikke mindst overflødig når man nu også har
> type-attributten.

Det er den også, det var min fejl. Pointen var linket til Googles
version af jQuery.

--
Andreas

Martin

unread,
May 2, 2012, 4:24:53 AM5/2/12
to
Nu har jeg holdt mig uden for denne debat mht jquery, fordi jeg ved
Birger ikke kan rykkes.

Nu bruger jeg en hel del jquery - så jquery har jeg skam inkluderet, dog
ikke fra googles cdn men fra cdnjs.com.

Hvor iøvrigt jqueryui, less og bootstrap også bliver hentet fra.
Less bliver dog fjernet når sitet ryger i produktion, der bliver nemlig
hentet 20 less stylesheets, og ja less css er nu dejligt :)
0 new messages