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
- 1942 megtekintés
Hozzászólások
na úgytűnik a /var/tmp-be ott van az összes session_id, eddig jó nyomon vagyok....
- A hozzászóláshoz be kell jelentkezni
Most akkor sajat session handlert hasznalsz, vagy a php sajatjat?
Egyebkent meg:
session.gc.maxlifetime
De most miert hibas ezert a php?
"-Pedig vegetariánus vagyok; csak növényevő állatokat fogyasztok!"
azenoldalamponthu
- A hozzászóláshoz be kell jelentkezni
nem hibás ezért a php, írtam is hogy ez a http sajátja, rossz címet adtam neki...inkább HTTP agyrém :)
- A hozzászóláshoz be kell jelentkezni
Rendben:), egyébként tényleg jobb, ha saját session handlert használsz.
"-Pedig vegetariánus vagyok; csak növényevő állatokat fogyasztok!"
azenoldalamponthu
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
É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.
- A hozzászóláshoz be kell jelentkezni
legjobb, ha a session le van tarolva adatbazisban, + timestamp, amit ugye mindig frissitesz.
Vagy: nezed a file letrehozas/modositas idejet.
Az idokorlatot meg ugye te allitod be.
"-Pedig vegetariánus vagyok; csak növényevő állatokat fogyasztok!"
azenoldalamponthu
- A hozzászóláshoz be kell jelentkezni
Csinálsz egy online_sessions táblát. Legyen benne egy sessionid mező és egy last_visit, ami legyen egy int mező.
Minden sessionban updateled a last_visit -t.
/var/tmp -t meg jobb, ha békén hagyod szerintem.
----------------
Lvl86 Troll
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
"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."
http://prog.hu/tudastar/102634/Bongeszo+becsukasakor+php+futattas.html
- A hozzászóláshoz be kell jelentkezni
Erre nem bíznék semmit. Egyrészt nem mindenki használ javascriptet. Másrészt vannak böngészők, amik leszarják az onunload eventet.
- A hozzászóláshoz be kell jelentkezni
Birom amúgy az ilyen dolgokat... OK, hogy nincs JavaScript! Hány embernél nincs? 1-2%? Mert napjainkban azért eléggé fel/visszapörgött, főleg az Ajaxnak köszönhetően.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Teljesen mindegy, meg ha van javascript is, akkor sem bizhatsz meg a bongeszokben hogy soha nem fagy ki, soha nem lesz aramszunet senkinel.
Ez a modszer sok sebbol verzik.
- A hozzászóláshoz be kell jelentkezni
A kliensre hagyatkozni...hat...ize...hogyismondjamcsak.
"-Pedig vegetariánus vagyok; csak növényevő állatokat fogyasztok!"
azenoldalamponthu
- A hozzászóláshoz be kell jelentkezni
é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 :)
- A hozzászóláshoz be kell jelentkezni
Akiknél nincs javascript azokon ez sem segít. Egy iframe-ben http-refresh-sel frissített oldal pedig kattog (Internet Explorer navigálás hang)...
- A hozzászóláshoz be kell jelentkezni
Friss XP telepítés után az első dolog szokott lenni, hogy kikapcsolom az összes hangot :)
- A hozzászóláshoz be kell jelentkezni
De a felhasználók nem fogják. Marad a javascriptes megoldás, nem sokan kapcsolják ki. Aki mégis, hamarabb kiesik.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
az 1 perc csak ugy kb.-ra írtam :)
- A hozzászóláshoz be kell jelentkezni
köszönöm nektek a sok jó ötletet megfogadom őket.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
na köszönöm mégegyszer a sok jó ötletet, djsilas féle megoldáshoz hasonló lett a végeredmény, ezzel el fogok még tökölődni egy darabig. Finomitgatom még ezt a témát, érdekes probléma. Na majd még zaklatlak titeket ilyen baromságokkal :)
- A hozzászóláshoz be kell jelentkezni
Amikor popupokat dobalsz mikor be akarom csukni a tabot, az usability fail.
Dontsd el hogy ha bezarja a felhasznalo akkor lepjen ki, vagy legkozelebb is maradjon bejelentkezve (maradjon hat, miert jelentkezzek be mindig?).
- A hozzászóláshoz be kell jelentkezni
És még az online júzerek száma is több lesz így :)
- A hozzászóláshoz be kell jelentkezni
Tudod hogy mikor nezett lapot utoljara, ha 5 perccel regebben akkor nem szamolod.
Azt mar megfigyeltem hogy manapsag a SELECT * FROM somewhere
queryknel nem jutunk messzebb, de hogy mostanra mar a WHERE
is elit dolog lett...
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Vannak olyan emberek, akik ezt a köcsög fícsört letiltják a retekbe.
- A hozzászóláshoz be kell jelentkezni
shutdown-nal nalam ff visszakerdez hogy becsukom-e a bongeszot, es ha nem-et nyomok, leall a shutdown.
Tyrael
- A hozzászóláshoz be kell jelentkezni