Autor Zpráva
Darker
Profil
Kdosi mě tu nedávno upozornil na nehezky velký počet XML-HTTP požadavků v chatu, a navrhl žešení přes kometu. Našel jsem si ukázkovou implementaci Komety v Javascriptu ale po vyzkoušení jsem zjistil, že se to chová úplně stejně - jeden požadavek, jedna informace...
Takže kde je rozdíl? Funkční kód zde.
ShiraNai7
Profil
http://en.wikipedia.org/wiki/Push_technology#Long_polling

Ale na běžných server bývají celkem těsná omezení maximální doby trvání připojení a hlavně dobu vykonávání PHP skriptu (či jiného).

edit: Takže pokud je zpracováno pouze několik zpráv během doby běhu skriptu, tak to množství ajax požadavků moc nesníží.
Darker
Profil
No mě to nestáhlo nikdy víc než jednu zprávu. Myslel jsem, že to bude pořád volat ten samý skript ale nebude se to muset připojovat.
ShiraNai7
Profil
Nemělo by. Pokud to tak dělá, tak to máš rozbité.
Krakatoa
Profil
Ne úplně chápu ty výrazy, které tu píšete, každopádně pokud máš vlastní server, nejlepší řešení na chat je websockets.
http://www.webnt.cz/8-websocket/
Naváže se spojení klient - server a posílají se informace, když nějaké jsou.
Darker
Profil
ShiraNai7:
Nemělo by. Pokud to tak dělá, tak to máš rozbité.
Tato fráze jsou teď jen prázdná slova. Nahoře máš odkaz na ukázku i na zdroj.

Krakatoa:
Přesně tohle jsem chtěl, dík moc. Proč vlastní server?
ShiraNai7
Profil
Darker:
Tato fráze jsou teď jen prázdná slova. Nahoře máš odkaz na ukázku i na zdroj.

??? Přeloženo: "Oprav mi to" ?

Ptáš se, k čemu ti je kometa, když se údajně chová stejně jako původní implementace. Z principu by ten nový mechanismus měl počet požadavků redukovat. Pokud tomu tak není, tak bude chyba někde u tebe. To je celé. Proč? Nevím. A je to mimo téma (K čemu je mi Kometa vs např. Proč mi nefunguje Kometa).
Darker
Profil
ShiraNai7:
??? Přeloženo: "Oprav mi to" ?
Zbytečný příspěvek. Pokud nevíš, proč výše uvedený kód nedělá co má, proč vůbec něco píšeš. Moje otázka, a to i nyní i předtím zní, jakým způsobem tedy kometa počet požadavků redukuje. Z toho vyplývá i - proč ten kód nic takového nedělá. Otazník se píše jen za větou, píše se vždy jen jeden a před ním se píše mezera.
Krakatoa
Profil
Darker:
No minimálně narazíš u webhostingu na časové omezení doby běhu php skriptu. A taky ti to na webhostingu asi nedovolí vytvořit spojení server - klient, ale tím si nejsem jistý.
Dej vědět, jak jsi dopadl s testováním websockets .-)
Já websockets zatím zkoušel jen doma na localhostu a na něm jedou výborně.
_es
Profil
Krakatoa:
nejlepší řešení na chat je websockets.
Neexistujúca či nedostatočná podpora v prehliadačoch.

Darker:
Proč vlastní server?
Lebo to nie je na zdieľaných serveroch podporované.

Moje otázka, a to i nyní i předtím zní, jakým způsobem tedy kometa počet požadavků redukuje.
Prečo si neprečítaš odkazovanú stránku v [#2] ShiraNai7?
Witiko
Profil
Darker:
Comet jsem ti doporučoval já. Vtip je v tom, že se data posílají s mime type multipart/x-mixed-replace, což znamená, že prohlížeč požadavek neukončí a čeká na další data. Na free serverech omezeno maximální dobou spuštění php scriptu. V ideálním prostředí by stačil jeden požadavek na veškerou datovou výměnu, v reálném prostředí je třeba cca. každých 60 sekund požadavek obnovit kvůli určitým prohlížečům. Ideální pro pochopení je koukat se s firebugem na http requesty při chatování na facebooku.

Nemám teď čas rozebírat tvé řešení, nicméně jak předeslal kolega ShiraNai7, budeš to mít nejspíš rozbité. Implementace Comet je celkem zábavná i bez toho, aby se člověk musel zabývat omezeními ze strany free serveru.

Websockets jsou skvělá technologie, nicméně co do podpory se zatím jedná mírně o hudbu budoucnosti. To by ti ale asi ani tak nevadilo vzhledem k tomu, že tvůj HTML Starcraft (je to pro něj, předpokládám?) se zpětnou kompatibilitou moc nezaobírá, co jsem zatím viděl. Větší problém ale samozřejmě bude fakt, že málokterý free server ti nabídne právě server-klient perzistentní spojení.

EDIT: Koukal jsem se na "ukázkové řešení" a zdá se, že data chodí jako text/plain. Možná bude zakopaný pes tady. A skutečně zkus přeformulovat název tématu, než to udělá nějaký z moderátorů, je matoucí.
Darker
Profil
Witiko:
Koukal jsem se na "ukázkové řešení" a zdá se, že data chodí jako text/plain. Možná bude zakopaný pes tady.
Tohle jsem opravil a stejně to nefunguje.
Opravdu rád bych to zprovoznil, a už nevím co s tím.
Moje představa byla taková, že budu moc s daty pracovat během toho, co je budu dostávat. Místo toho to čeká a čeká a pak to vypíše vše najednou.
PHP část skriptu:
if(isset($_GET["code"])){  //Abyjste si mohli zobrazsit kód, pokud ho změním
  header("Content-Type: text/plain");
  echo file_get_contents("comet.php");
  die();
}      
if(isset($_GET["R"])){
header("Content-Type: multipart/x-mixed-replace");
if(rand(1,10) == 1){
    /* Fake an error */
    header("HTTP/1.0 404 Not Found");
    die();
}
echo "<script>/*<endora>*/</script>";
/* Send a string after a random number of seconds (2-10) */
for($i=0;$i<10;$i++)  {
  sleep(2);
  echo "Hi! Have a random number: " . rand(1,10)." The time is ".date("i.");
}
die();
}
ShiraNai7
Profil
Zkus dát toto na začátek skriptu:

if(($ob_level = ob_get_level()) !== 0) for($i = 0; $i < $ob_level; ++$i) ob_end_flush();
ob_implicit_flush(true);
Darker
Profil
Zkusil jsem to dát jak před tak i za posílání multipart hlavičky.
Také jsem přidal do cyklu který posílá (vlastně by měl posílat) jednotlivé zprávy o náhodném čísle funkce flush() a ob_flush() (na které jsem přišel když jsem zkoumal co dělá implicit flush) ale nic.
ShiraNai7
Profil
Darker:

Hm. Každopádně ten můj kód by se měl použít jen jednou. Vypíná totiž všechny existující buffery. A to stačí jednou.
Darker
Profil
Já ho použil jen jednou.
Darker
Profil
Vzhledem k tomu že mi nafungovalo okamžité načítání zpráv rozhodl jsem se skript napsat tak, aby vždy 5 sekund čekal na nějaká nová data (sleep a cyklus dotazů do DB) a pak spustil funkci která případná data zpracuje.
Tím se mi povedlo úspěšně a dost neprakticky sestrojit cosi, co zprávu zobrazí pustí znova request (requesty se samozřejmě s odstupem v závislosti na tom, jestli je chat zobrazenýu řetězí) ale dál se načítá. A načítá se i po vypršení ajaxového tiomeoutu.
Tohle je ten request.
                   $.ajax({
                               type: "POST",
                               url: "ajax.php",
                               data:{chat:"",time:chat.time},  //time je číslo poslední načtené zprávy
                               async: true,
                               cache: false,
                               timeout:7000, 
                               success: showchat,   //zobrazí případné zprávy do html a aktivuje request
                               error: function(XMLHttpRequest, textStatus, errorThrown){
                                      if(chat.reconnect)  
                                       showchat("",true);
                                      else
                                       chat.onlineControl(true);
                               },
                           });

Navíc, když pošlu zprávu trvá dlouho i request který posílá zprávu. Chybu s tím, že na tento request se také spouštěl cyklus čekání na zprávy jsem opravil, ale nic to nezměnilo.

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