Vynutit překreslení á la push v Cometu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kudlajz
Člen | 70
+
0
-

Zdravím.

Mám na své stránce chat mezi uživateli a chtěl sem použít techniku Comet, kdy druhý uživatel odešle zprávu a tomu prvnímu se zpráva „pushne“ do prohlížeče, tj. vynutí se překreslení.

Momentálně to mám tak, že volám přes javascript každých 30 sekund handle, která zprávy překreslí, ale přijde mi to neefektivní z důvodu, kdy např. ten chat nechám celý den otevřený, tak to bude zbytečně každých 30 sekund odesílat request. Na druhou stranu zas ta konverzace nemůže být tak rychlá, protože user 1 pošle zprávu, userovi 2 se zobrazí např. až po zmíněných 30 sekundách a tak to pokračuje.
Napadá někoho, jak by se to dalo udělat v Nette?

Napadlo mě ještě třeba kontrolovat např. každých 5 sekund id poslední zprávy a pokud tam bude ID větší, než je dosud přítomné v konverzaci, tak udělat invalidaci. S tím by bylo např. spojeno přehrání zvuku (ale to už je maličkost).

Ta technika kontroly po 5 sekundách mi přijde možná lepší (méně náročná), jelikož se bere jen ID poslední zprávy a netahají se všechny zprávy z DB. Co jsem našel na internetu, tak je na tyhle requesty nejlepší nginx, no já bohužel mám zatím k dispozici jen apache.

Editoval kudlajz (5. 1. 2013 22:21)

llook
Člen | 407
+
0
-

Comet by se v PHP realizoval dost obtížně. Snáz to půjde v Javě nebo ASP.NET, které jsou navržené tak, že na serveru běží jedna instance aplikace, která odpovídá na požadavky. Zatímco PHP je navržené tak, že pro každý požadavek se spustí celá aplikace znovu a relativně dost izolovaná od ostatních svých instancí. Neříkám, že to nejde (pár nápadů bych měl), ale nejde to snadno.

Ten druhý způsob bude lepší. Nejlépe použít nette.ajax.js s data-ajax-append a přenášet pouze nové zprávy (where id > ?).

kudlajz
Člen | 70
+
0
-

Takže je ještě možnost celou aplikaci přepsat v ASP.NET MVC frameworku a implementovat to na hostingu či serveru s IIS.

Ale zatím teda použiju ten druhý způsob s ID.

LeonardoCA
Člen | 296
+
0
-

Než ASP apod. to už raději zkusit něco s NodeJShttp://stackoverflow.com/…chat-example

kudlajz
Člen | 70
+
0
-

jasir napsal(a):

Nebo react :-) https://github.com/reactphp/react

Pracoval si s tím už? Já nemám vůbec páru jak to implementovat..

Filip Procházka
Moderator | 4668
+
0
-

@kudlajz: tak si přečti dokumentaci :) Taky bych šel raději do Reactu, protože funguje nativně v PHP a není na to potřeba měnit hosting ;)

kudlajz
Člen | 70
+
0
-

Já si ji četl, díval sem se na ten příklad TCP chatu, ale nějak nevím jak dál. Chápu, že ten listener by měl běžet asi nonstop a čekat na připojení a podle potřeby pak odesílat odpovědi, ale jak ten proces spustím, aby běžel nezávisle na ostatních? Pokud to teda chápu celé dobře.