Autor | Zpráva | ||
---|---|---|---|
Frendly Profil |
Pekný deň,
Robím chat pomocou ajax long pooling, ale mám menší problém. Môj postup: Zavolanie funkcie load_chat() --> otvorí súbor cez xmlhttprequest , kde nastavím set_time_limit(120) a zistím nové príspevky, ak sú tak sa vypíšu a zavolá sa celá funkcia znova, ak nie sú, tak uspím pomocou sleep(10) beh skriptu na 10 sekúnd a znova sa opýta. Po 10 pokuse sa ukončí ajax a znova sa zavolá. No lenže ja keď otvorím ten súbor, tak mi nejde nič robit na stránke ani refresh nič, dlho sa to načitáva. Asi som zle pochopil ajax long pooling, neviem či to robím dobre. |
||
_es Profil |
#2 · Zasláno: 8. 6. 2014, 18:08:40
Frendly:
„neviem či to robím dobre.“ To asi nevie ani nikto iný. Napísal si to nejako zmätene, mal by si dať živú ukážku, alebo to napísať nejako zrozumiteľne. Trebárs, v JS žiadne „uspanie pomocou sleep(10)“ nie je, takže je ťažké si predstaviť, čo to má byť. Aj všeobecne, čo to „ajax long pooling“ má byť. |
||
Kubo2 Profil |
_es:
„To asi nevie ani nikto iný.“ Pokúsim sa jeho text trochu preformulovať, po ôsmom raze, čo si to čítam, nejako snáď chápem súvislosti: [#1]Snaží sa vytvoriť si chat za pomoci metódy AJAX a jazyka PHP. Na strane klienta si vytvoril funkciuload_chat() , v ktorej tele sa pomocou AJAXu pýta serverového skriptu na nové príspevky. Na serveri nastaví maximálnu možnú dobu behu skriptu na 120 sekúnd (dve minúty).
Tuto nastáva zjavné vetvenie: - V prípade, že pribudli nejaké príspevky -- skript ich odošle klientovi ako svoj výstup a skončí. -- Tu skončí aj čakanie na odpoveď požiadavky na strane klienta, JavaScriptom zobrazí nové príspevky a zjavne ukončí funkciu load_chat() , ktorá sa však rekurzívne opäť zavolá.
- V opačnom prípade však -- serverový skript uspí pomocou sleep() na desať sekúnd a klient pritom čaká na odpoveď (čo mimochodom nie je veľmi rozumné). Tu vyvstáva zjavný problém.
-- Opäť sa začne vyhodnocovať tento popísaný serverový proces (zrejme to má zacyklené: „...a znova sa opýta. Po 10 pokuse [...]“). Zjavne súvisiaca téma. |
||
_es Profil |
#4 · Zasláno: 8. 6. 2014, 19:28:35
Frendly:
Objekt XMLHttpRequest nie je vhodný na prácu s čiastočne načítanými dátami z HTTP požiadavku.
|
||
Amunak Profil |
Frendly:
Vůbec nepoužívej sleep(). V naprosté většině případů jeho použití znamená, že máš špatně navrženou aplikaci. Navíc bys při tom snadno mohl narazit na řadu problémů (memory limit, connection limit, ...) Jestli prostě jen kontroluješ příspěvky na serveru, nebo tak něco, tak prostě měj funkci, která se po načtení zavolá, pošle požadavek na server, ten ihned zpracuje (v odpovědi může být klidně jen JSON-encoded seznam nových příspěvků; když je prázdný, víš, že nic nového nepřišlo), (např.) nové příspěvky přidá do stránky a informuje o tom uživatele, a nakonec (takhle po zpracování požadavku) zavolá Na serveru pak bude prostě jen skript, který (třeba z parametru v požadavku) pozná, který příspěvek klient načetl jako poslední, a načte jen ta nová. Ty prožene přes json_encode a hned vypíše. Tím způsobíš, že se zhruba každých deset sekund načtou nové příspěvky. Zároveň pokud by připojení trvalo extrémně dlouho, nebudou se furt dokola volat další požadavky, ale počká se, než se ten aktuálně odeslaný zpracuje. Díky tomu pak můžeš interval snížit třeba i na dvě sekundy, a neměl by s tím být žádný problém. Uspávat musíš u klienta, ne na serveru. |
||
_es Profil |
#6 · Zasláno: 9. 6. 2014, 01:55:42
Amunak:
„a nakonec (takhle po zpracování požadavku) zavolá setInterval s časem deset sekund a jako parametrem sebe sama.“ Asi si myslel setTimeout, opakované volanie setInterval (bez zrušenia) by za chvíľu zahltilo server a prehliadač sieťovými požiadavkami.
|
||
Časová prodleva: 10 let
|
0