Jak zjistit jestli je uživatel s určitým id přihlášený?

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

Chtěl bych udělat ukazatel online uživatelů co jsou zrovna na fóru. Do tabulky users si u každého uživatele ukládám poslední presenter který použil.

Chtěl bych udělat dotaz do DB, který mi vytáhne všechny uživatele, kteří mají jako poslední presenter uložený právě ten presenter fóra a zároveň jsou online.

Zasekl jsem se už na tom, jak ověřit, zda je uživatel s určitým ID vůbec přihlášený. Poradí mi někdo?

Etch
Člen | 403
+
0
-

No tak běžně se tam ukládá i čas poslední akce, kterou uživatel udělal. Pak prostě vytáhneš uživatele, který má poslední presenter fóra a čas poslední akce now() – 5 minut.

Pilda
Člen | 52
+
0
-

Já to myslel tak, že pokud někdo má jako poslední akci ten fórum presenter a zároveň je online, tak ho to vypíše, to mi přijde ideální.

Čas poslední aktivity se taky ukládá, ale nemyslím, že by to bylo dobré použít bez filtru co odfiltruje uživatele co nejsou zrovna online, protože kdyby třeba někdo četl příspěvky či psal příspěvek víc než těch 5 minut, tak ho to tam nevypíše, nebo se stane to, že bude uživatel třeba už offline a ono ho to vypíše.

Jde o to, že nedokážu z id uživatele zjistit jestli je online, nebo ne.

Mohlo by to fungovat třeba tak, že bych si v presenteru vytáhl všechny uživatele co mají jako poslední použitý presenter fórum a nějakou poslední aktivitou a to celé bych profiltroval v šabloně ifem, který by pouštěl jenom uživatele co jsou online.

Myslel jsem, že mi v šabloně projde toto, ale neprošlo:

{foreach $possible_users as $possible_user}
	{if $possible_user->isLoggedIn()}
		{$possible_user->name}
	{/if}
{/foreach}

Editoval Pilda (17. 2. 2012 18:41)

Etch
Člen | 403
+
0
-

Ať mě někdo opraví, pokud budu plácat kraviny, ale to, co ty chceš, je „Mission Impossible“.

Tohle nejde zajistit už jen díky tomu, jak funguje komunikace mezi klientem a serverem. Klient požádá server o zpracování nějakého požadavku, ten ho zpracuje, vrátí zpátky odpověď a dál už ho klient nezajímá. Poté, co server pošle odpověď na požadavek, už server nemá jak zjistit, co klient dělá, pokud mu to on sám neřekne.

Můžeš dělat různou magii, ale nikdy to nebude dokonalé. Různé příklady a potíže s nimi:

  1. ukládat čas posledního požadavku a kontrolovat pomocí now() - X minut.
    • + ultra jednoduchá implementace
    • – uživatel, který čte dlouhý článek se může jevit jako OFFLINE
    • – uživatel, který zavře prohlížeč ihned po požadavku se jeví jako ONLINE, i když je OFFLINE
  2. posílat jednou za X vteřin ajaxem požadavek, který bude zajišťovat update posledního požadavku
    • + jednoduchá implementace
    • – uživatel, který není u počítače, ale nezavřel prohlížeč se může tvářit klidně X dní, že je ONLINE, i když je na dovolené na Kanárech
  3. Kombinace 1 a 2
    • + řeší druhý mínus z varianty 1
    • + řeší mínus z varianty 2
    • – neřeší první mínus z varianty jedna
  4. posílat jednou za X vteřin ajaxem požadavek a předávat si nějaká užitečná data (jestli se mění pozice myši, jestli uživatel scroloval, jestli psal, atd) a podle toho se zachovat
    • + relativně přesné
    • – pokud to má být uděláno opravdu dobře, tak dost složitá implementace

Posléze můžeš čarovat s různými JS eventy, ale všechno to bude ve výsledku nespolehlivé. Otázka zní: opravdu potřebuješ takhle přesnou statistiku online lidí?? K čemu je to vlastně dobré?

PS: Pokud někdo zná nějaké jednoduché a zároveň přesné řešení tohoto problému, tak ať mě prosím opraví.

EDIT: Typo

Editoval Etch (17. 2. 2012 23:45)

Melmen
Člen | 132
+
0
-

Osobně to řeším variantou číslo jedna :) Je to jednoduchý, a funkční. Interval mám tři minuty. Pravda, pokud uživatel čte dlouhý článek víc jak 3minuty, bude identifikován jako offline. Ale pak někam klikne, a opět je online. Nevidím v tom problém :)

Pilda
Člen | 52
+
0
-

Etch:
díky za info. Neuvědomil jsem si ten problém s komunikací. Zatím jsem udělal tu 1ku a později tam zkusím nějak vymyslet tu 4ku. Mohlo by asi stačit třeba jednou za minutu poslat info pokud uživatel buď hýbl myší, nebo napsal něco do formuláře, co myslíš?

A ano, potřebuji opravdu takhle přesnou statistiku jestli je někdo online, nebo ne, protože to považuju za docela důležité a flustrující pokud to nefunguje tak jak má. Ne jednou se mi stalo, že jsem třeba přišel na nějaké fórum, viděl nějakého uživatele co by mi mohl pomoct, že je online, tak mu rychle napsal a čekal na odpověď, jenže on byl už offline v době kdy jsem tam vstoupil.

Editoval Pilda (18. 2. 2012 1:18)

Etch
Člen | 403
+
0
-

Pilda napsal(a):

A ano, potřebuji opravdu takhle přesnou statistiku jestli je někdo online, nebo ne, protože to považuju za docela důležité a flustrující pokud to nefunguje tak jak má.

No jenže problém je ten, že to nikdy nebude fungovat tak jak má. Vždy tam bude nějaká prodleva a je jedno jestli 5 minut nebo 10 vteřin. Nikdy to nebude stoprocentní.

Pilda napsal(a):

Ne jednou se mi stalo, že jsem třeba přišel na nějaké fórum, viděl nějakého uživatele co by mi mohl pomoct, že je online, tak mu rychle napsal a čekal na odpověď, jenže on byl už offline v době kdy jsem tam vstoupil.

To ale nemusí být způsobeno tím, že už nebyl ONLINE. Mohl v tu chvíli dělat něco jiného a pak se prostě odhlásit. Nebo zrovna neměl náladu odpovídat. :) Tohle nelze 100% přisoudit tomu, že byl daný uživatel OFFLINE. Problém je, že třeba ten uživatel může být ONLINE, ale čte nějaký dlouhý článek a poté co ho dočte se hned ohlásí, takže vůbec neví, že ty si mu psal nějakou PM. Na to, aby to fungovalo, by si musel řešit i to, aby daný uživatel dostal nějakou notifikaci, že mu přišla nějaká PM a to opět zase ajaxem. Má to mnoho úskalí, proto jsem také psal, že pokud má být varianta 4 napsaná dobře, tak do opravdu dost práce a musí se při tom myslet na velkou spoustu faktorů.

Pilda napsal(a):

Zatím jsem udělal tu 1ku a později tam zkusím nějak vymyslet tu 4ku. Mohlo by asi stačit třeba jednou za minutu poslat info pokud uživatel buď hýbl myší, nebo napsal něco do formuláře, co myslíš?

Popravdě si myslím, že je to zbytečná práce, kterou ocení jen minimální množství uživatelů. Hlavně implementace něčeho na způsob varianty 4 se nedělá většinou kvůli banální věci typu „výpis uživatelů, kteří jsou online“. Používá se to spíše k nějakému realtime monitoringu, generování různých heatmap a podobným věcem. Jenže to na nějakém fóru je většinou dost nepotřebné. Může se to hodit na webu nějaké firmě, která chce třeba upoutávat na nějakou svou novou službu nebo aplikaci, aby našla pro takovou kampaň co nejvhodnější místo.

Další věc je, že čím více budeš posílat dat, tím více to logicky bude zvedat traffic a vytěžovat klientovo připojení. Nelze na to koukat pouze z pohledu uživatele klasického PC nebo notebooku, který je připojen na nějaké wifi nebo kabelem, ale i z pohledu uživatele, který na tvůj web kouká třeba přes mobil a je připojen pomocí GPRS. Jasně je to třeba jen pár desítek bajtů na request, ale furt je to zbytečný traffic. :D

Takže můj názor je, že pokud to chceš používat jen na kontrolu lidí ONLINE, tak je to zbytečnost a nic moc ti to nepřinese. Pokud by si to chtěl v budoucnu používat právě třeba k realtime monitoringu a podobným věcem, tak bych zas zvážil, jestli nevyužít služeb nějaké firmy, která se tímto zabývá.