Vynutit překreslení á la push v Cometu
- kudlajz
- Člen | 70
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
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 > ?).
- LeonardoCA
- Člen | 296
Než ASP apod. to už raději zkusit něco s NodeJS, http://stackoverflow.com/…chat-example
- kudlajz
- Člen | 70
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
@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
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.