ugrás a tartalomhoz

Online, offline státusz eldöntése

Radon · Jún. 2. (Sze), 21.46
Szeretném jelölni, hogy valaki épp online, vagy offline.
Az addig egyszerű, hogy ha belép, akkor a státuszát updatelem online-ra, és ha megnyomja a kilépés gombot, akkor offline update.
De azt hogy szokták megoldani, hogy valaki pl 10 perce inaktív (és le is jár a sessionja), akkor a rendszer elmentse, hogy már offline?
Köszi.
 
1

Nem tudom most hogy megy,

inf · Jún. 2. (Sze), 22.45
Nem tudom most hogy megy, régen saját session kezelőt kellett írni hozzá, és abban meg lehetett oldani. Azt hiszem még cronjob sem kellett hozzá, csak callback függvényeket kellett megadni. Keress rá, hogy php custom session.

Amúgy érdekes itt elgondolkodni olyan dolgokon is, hogy mi van akkor, ha valakinek több munkamenete van egyszerre, mert akkor ha az egyikből kilép, akkor inaktívnak jelöli majd a rendszer úgy is, hogy a többi munkamenet még él.
3

Boolean helyett integer

Arnold Layne · Jún. 3. (Cs), 11.39
valakinek több munkamenete van egyszerre, mert akkor ha az egyikből kilép, akkor inaktívnak jelöli majd a rendszer

Boolean helyett egész számot kell megadni. Ha belép inkrementálni, ha kilép dekrementálni kell. Mivel számból minden igaz ami nem nulla, így csak igen szerencsétlen csillagzat alatt mehet félre valami. Mert ugye tudjuk, hogy bármi ami elromolhat, az előbb-utóbb el is fog romlani. :)
2

A legegyszerűbb megoldás, ha

Endyl · Jún. 3. (Cs), 09.58
A legegyszerűbb megoldás, ha tárolod, hogy mikor volt utoljára aktív (jelentsen ez bármit is). Aki az utolsó x percben aktív volt, az online-nak minősül és kész.
4

Tehát minden felhasználónak,

Radon · Jún. 9. (Sze), 14.10
Tehát minden felhasználónak, minden kattintásánál updateljem az utolsó_aktivitás mezőjét? kicsit sok sql lekérés egy online státusz miatt.
És milyen gyakran értékeljem ki minden felhasználó utolsó_aktivitás értékét?
A php nem csak akkor fut le, ha egy kliens meghívja az oldalt? szóval magátol az a szerveren nem tud semmit csinálni. Szóval az ellenőrzéshez is egy felhasználó aktivitás kell.
5

Hány felhasználóra számítasz

Endyl · Jún. 9. (Sze), 14.28
Hány felhasználóra számítasz és tőlük mennyi "kattintásra" másodpercenként, hogy sok lesz plusz 1 update*? Egyébként emiatt írtam, hogy "jelentsen bármit is az aktivitás". Lehet ez egy js script is, ami a szükséges és elfogadható gyakorisággal és feltételek teljesülése esetén hívja meg az aktivitást jelző végpontot.

A második kérdést meg nem értem. Akkor értékeled ki, amikor kíváncsi vagy rá, hogy ki van online. Egy boolean flag sem csinál semmit önmagában az adatbázisban, ha nincs lekérdezve valami miatt. SELECT foo FROM user WHERE last_active > :threshold

* Ha egyáltalán kell plusz egy update, és nem lehet része egy amúgy is futó update-nek. Vagy mondjuk ha az adatbázisod már amúgy is tartalmaz infót az aktív munkamenetekről, akkor csak lekérdezed, hogy kinek van aktív munkamenete.
6

Pont ezért nem csinálják a

inf · Jún. 9. (Sze), 22.53
Pont ezért nem csinálják a legtöbb oldalon, mert szinte senkit nem érdekel, és drága ahhoz képest. Amúgy lehet javítani rajta, ha egy logba vagy event storage-be gyűjtöd az aktivitási infot append only módon, és utána dolgozod fel egy daemonnal néhány percenként egy-egy adagot.
7

Miért ne?

Pepita · Jún. 10. (Cs), 13.03
Ahogy Inf is írja, nem kötelező a db-ben (pl users tábla) tárolnod, lehet ez egy független tároló, ahol csak user_id és időpont van.
A megvalósítás módját leginkább a felhasználáshoz érdemes igazítani, attól függ, mikor és mire kell neked ez az adat, egyszerre mennyi felhasználóé, stb.
Endyl megoldása valóban a legegyszerűbb, érdemes abból kiindulni, vagy ha további információkra is szükséged van, mint pl egy chaten, hogy "éppen gépel..." és hasonlók, akkor websocket. A témaindító alapján viszont inkább ez a last_activity irány elég lehet.

És milyen gyakran értékeljem ki minden felhasználó utolsó_aktivitás értékét?
Biztos, hogy ezt külön ki kell értékeljed? Ha pl csak arról van szó, hogy egy sidebox-ban meg akarsz mutatni maximum 10 "online" felhasználót, akkor ez csak egy
SELECT akármi FROM users 
WHERE user_id IN (azok az id-k a másik tárolóból, amikhez a timestamp > előző 5 perc)
LIMIT 10
(És ezt az eredményt is cache-elheted, hogy ne minden request-nél "számold ki", csak pl 2 percenként.)
Lehet, hogy könnyebb lenne, ha írnál példát rá, mire kellenek a vélhetően online felhasználók.

A php nem csak akkor fut le, ha egy kliens meghívja az oldalt?
Nem, többféle módon is futtatható, pl:
- http request ("ha egy kliens meghívja")
- parancssorból (php /path/to/my/script.php paraméter1 paraméter2)
- cron job (ugyanaz, mint parancssor, csak időzítva)
- folyamatosan futó (pl websocket, RabbitMq feldolgozó)
Itt is az a kérdés, hogy mi a feladat, és az ahhoz legoptimálisabb futtatási módot keresni.