PHP-ról javitva HTTP agyrém

Szevasztok,

belefutottam a már sokak által leírt "online felhasználó listázása" problémába php alatt.
Szokásos történet, user belép az oldalra sql-ből kiránt a jelszó/pass páros minden ok, $_SESSION['belepettmarhajo']=true; létrehoz, aztán sql táblába beír session_id() meg a felhasznaló név meg egy két dolog. Ezeket szépen kiirjuk az oldalra, majd ha szabályosan logout akkor meg kitöröljük az sql-táblából a usert, session_destroy() és kész is minden marha jó felhasznaló session legyilkolva, többi online user már nem is látja.

Igen ám de mivan ha csak úgy laza kézmozdulattal bezárja a böngészőt ahelyett, hogy szabályosan kilépne? SQL-ben beragad a session meg egyébb dolgok, tehát a többi nép még mindig online-nak látja.

Namost PHP alatt erre normális megoldás nincs, ill. eddig nem találtam, már csak a HTTP protokol miatt is. Más kérdés hogy ASP.NET alatt van valami session_abandon(server_side_script) ami lefut ha megszunik a session.....de ez ugye php...

Namost van erre esetleg valami ötlet vagy irány amerre elindulhatok???

Szerver oldalon tudok root-ként futtatni cron-bol akármit.

Gondoltam arra hogy cron-ból 1 percenként lefuttatok egy scriptet ami "ha lehet ilyet??????" megnézi az összes aktiv még nem lejárt session_id-t és összehasonlítja az sql-ben letárolt session_id-kel, ha van olyan a DB-ben ami már nem aktiv session akkor azt törli, persze a timeout-ok meg egyebeket figyelembe véve.

Kérdés az hogy szerveroldalról láthatom-e az összes még nem timeout-olt php session-t?
pl. a /var/tmp-ből. vagy akarhonnan.....

Na bocs hogy ilyen hosszan leírtam, de ez a helyzet. :)

Ja igen ha esetleg érdekes lehet: freebsd + apache + php + mysql

Hozzászólások

na úgytűnik a /var/tmp-be ott van az összes session_id, eddig jó nyomon vagyok....

Időnként fogod, és kitakarítod azokat, akik már túl rég óta (5-10p) benn vannak.

Nem feltétlen kell ehhez cron, ha nincs, akkor úgy szoktam ezeket megoldani, hogy valahol (tipikusan config tábla) tárolom, hogy mikor volt utoljára takarítva, aztán az első olyan kérésnél, ahol lejárt az időkeret, futtatok egy takarító query-t + frissítem a config táblát.

Ez többek között azért is jó, mert éjjel, mikor valószínűleg kevesen vagy senki nem nézi az oldalt, nem futtat feleslegesen query-ket. Más kérdés, hogy akkor egyébként is ráér a gép :)

----------------
Lvl86 Troll

Értem, én is ezt szeretném, csak azt nem tudom hogy amikor az oldal lefut és ezzel együtt a takarító script, akkor honnan tudom, hogy mely session-ök aktívak ill. egyáltalán léteznek??? Mert nem látok ki az adott session-ből. Ezért gondoltam hogy php-cgi scriptet futtatok mert onnan belátok a /var/tmp-be ahol fszan ott vannak az aktuális session-ök.

hmmmm, most gondolkozok.....a sajat session-öből is belátok filekezeléssel a /var/tmp-be csak ez mondjuk security risk.

Alapvetően nem javaslom, hogy bármiféle sessionfilet végig akarj olvasni, méghozzá a következő okokból nem:

  • Lábon vagy lőve, ha esetleg session handlert akarsz váltani
  • Kiba sok IO művelet

Mivel a jelen levő felhasználók sokkal szűkebb időintervallumra vonatkozó adat (5 perc) inkább tárold ezt egy jól felépített MySQL memory táblába, ahonnan minden X request után a last seen alapján törlöd a felhasználókat.

és akinél az áramszolgáltató egy laza kézmozdulattal áramszünetet tart? :)

Javascriptből csinál egy heartbeat függvényt, ami percenként hallat magáról.
Akiről nincs hír már 3 perce, az nem online.
Persze ettől még lehet csinálni kijelentkező oldalt, meg javascriptet, így nem-extrém esetben gyorsabb lesz a dolog :)

Nem ertem mi ezen a problema. Elmented mikor nezett meg utoljara napot, ehez kepest x perc amig bejelentkezettnek tekinted, utana nem irod ki.

Egyszer meg majd kitakaritod, de ha nincs sokmillio latogatod akkor raer naponta 1x.

Ha valami ugy kezdodik hogy 1 percenkent cront futtatok, az nem lehet jo.

köszönöm nektek a sok jó ötletet megfogadom őket.

Bár régen volt, de én ezt anno úgy oldottam meg, hogy a belépett user(id) mindegy egyes tevékenységénél generáltam neki egy "last_activate" timestampet. Amikor le akartam kérdezni, hogy kik az onlányok, akkor egyszerűen list all where timestamp < now-5min.

Természetesen nem atombiztos a cucc, de ugye kérdés, hogy a nasa-nak megy, vagy csak józsibácsinak a webshopba.

Ha session_set_save_handler()-rel írod felül a php session-kezelését, akkor a session lejáratot kényelmesen tudod kezelni. Állítsd be 3 percre, és a php elintézi neked a többit. Mondjuk, így, ha valaki több, mint 3 percig bámul egy oldalt, akkor offline lesz. Arra meg tényleg valami rendszeres kopogtatást kell megoldani, hogy fennmaradjon a session.
A leírtakból nekem úgy tűnt, hogy nem írtad felül a session kezelését, pedig, ha egyedit akarsz, célszerű megtenni, ahelyett, hogy párhuzamosan használsz egyet a php-éval.

http://haxel.hu/wodehouse-konyvek.html

Korán van még, hogy minden hozzászólást elolvassak, addig még nem látok el :P

1, body onunload -> nem léptél ki! kilépsz!?
2, ez igazából sok mindentől függhet, hogy jó-e neked. Érdemes lehet saját statisztika létrehozása, hogy mi mit látogat, hogy tudd mi után érdeklődnek a userek. Ha már ilyened van, akkor onnan csak egy kis lépés, hogy melyik user utoljára mit nézett és mikor. Ha már ~5 perce semmit, akkor delete. És már nem is írja... Másik, lehetőség, hogy az az említett 5 perc egyenlő legyen a session time limitjével. Így el is tűnik a listáról, meg tényleg nem is lesz belépve
----------------------------
Weblap, Tárhely, Domain

onUnload -> vannak olyan elvetemult emberek, akik minden ilyen folyamatot egy shutdown -h now -al oldanak meg (en pl, ha mar nincs a gepre szuksegem)
Ilyenkor felfogugrani nekem az a popup?
Kifagyott brozernel a killall vagy a win taszkmenedzser fog majd popupot nyomatni?
Hagyjuk mar ezeket.

"-Pedig vegetariánus vagyok; csak növényevő állatokat fogyasztok!"
azenoldalamponthu