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
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 funkciu load_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
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á setInterval SetTimeout s časem deset sekund a jako parametrem sebe sama.

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

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0