Zjištění, zda je uživatel online
- Webster.K
- Člen | 212
Zdravím, řeším další prekerní situaci, tentokrát okolo uživatelů.
Můj dotaz je, jak správně udělat indikaci, že je ten či onen uživatel
online?
Nekde na jakpsatweb jsem našel kravinu ve stylu uživatel se přihlásí a
změní se status na že je online a když klikne že se odhlašuje, změní se
na offline → problem je že nikdo neklika na odhlásit…
Další co mě napadlo bylo monitorovat aktivitu uživatele, tedy vždycky když
přejde z jedné stránky na druhou, zapsat do DB jeho poslední aktivitu a od
toho odečíst třeba 5 minut a pokud během 5ti minut nebude mít aktivitu, je
offline… nepřesný ale funguje.
Moje myšlenka se dále pohybuje okolo ajaxu, kdy v pravidelných intervalech
pinguju server, což je sice přesný, nicméně si myslím, že při více
uživatelích to bude náročnější pro server a hlavně nefunkční, pokud by
někdo JS vypnul (jasně, on by nefungoval celej bootstrap a další prvky co na
webu používám, ale někteří uživatele jsou experti).
Jaký je tedy správný postup jak toto vyřešit? Hledal jsme i jestli nette
na to nemá přímo nějakou komponentu skrytou v users ale bohužel nic jsem
nenašel, zajímalo by mě, jak to řešíte vy, popřípadě vaše rady, na co
si dát pozor :)
- CZechBoY
- Člen | 3608
No jak píšeš tak je to asi akceptovatelný, jiný řešení skoro není.
Ještě můžeš využít websockety, ale to už je moc overkill si myslim
:D
U toho ajaxu záleží jak často to budeš posílat (nějakejch 30s by mohlo
pro někoho stačit). Když ti přijde uživatel bez js tak holt bude
aktualizovanej jenom přes zobrazení stránky.
- Webster.K
- Člen | 212
Podle toho co jsem se dočetl o websocketech, tak na serveru musí být ještě neco dalšího než třeba apache :/ což mi trochu komplikuje praci :D :D asi zkusim ten ajax, resp zkusim přijít na to, jak to použít přes nette. Mít projekt mimo nette, jen několik souboru, budu pres ajax otevirat jen soubor s urcityma parametrama v intervalech, jak ale na to v nette? Přes handlery? Nebo existuje nějaký správný řešení přímo v nette jak to udělat?
- Oli
- Člen | 1215
Pro webSockety ti stačí php s rozšířeníma (ZMQ extension a ještě myslím jedno). Pokud se dobře pamatuju, tak na to stačí tyhle 2 balíčky:
{
"cboden/ratchet": "^0.3.5",
"react/zmq": "0.2.*|0.3.*"
}
Rozchodil jsem to na Symfony, ale asi to bude podobný nad nette.
U toho ajaxu si myslím, že není potřeba vubec spouštět Application, routování, presentery, … Udělal bych si script, který by jen přijmul data a podle nějaký hashe změnil hodnotu, kdy byl naposledy uživatel online. Uživatele bych identifikoval na základě cookie, která by se mohla při každým requestu měnit. Takže ani nemusíš spouštět session, routovat, ověřovat práva… Pokud by to někdo podvrhl, tak nejhorší co by se mohlo stát (pokud by jsi tam neměl SQL injection), že by uživatel byl pořád online/offline.
Pokud by jsi to potřeboval extremě rychlé, tak bys ani nemusel startovat container a přihlašovací údaje k databázi si vysosnout rovnou s configu a rovnou přes PDO zavololat db.
- srigi
- Nette Blogger | 558
Nemal by si pouzivat tuto, tzv. heartbeat techniku. Predstav si, ze mam
1000 uzivatelov a kazdy robi ping kazdych 10s. To moze predstavovat zataz
100rq/s typu „ano vysledok je stale ten isty“.
Absolutne si nemal hlavu s tym, ze ludia mozu mat vypnuty JS. Pre tieto pripady
stale mozes fallbacknut na riesenie s lastActivityTimestamp.
Ten JS pories tak, ze pingne iba na window.onunload
. Je to velmi
spolahlive, zachyti to zavretie tabu, zavretie browsera, asi aj uspanie PC
a pod.