Hello
PHPbol gyenge vagyok szerencsere, es most van is egy kisebb problemam: Ha jol ertem, a _SESSION egy ugymond userre egyedi valtozo, pl egy portalon bejentkezik valaki, nyilik neki egy session es lehet adatokat tenni bele. ha masik user is bejentkezik, neki is nyilik egy session es masik, egyedi adatokkal lehet feltolteni.
Nekem most valami _SESSIONS hoz hasonlo valtozo kene, amivel ranezhetek az osszes tobbi session egy biyonyos valtozojara, adatvizsgalat miatt. Lehetseges ez? neten nem talaltam out of the box megoldast.
Lehetoseg volna pl egy allomanyba, adatbazisba menteni az adatot, igy minden mas session is hozzaferne a masik session adatahoz. ellenben, ebbol a kozponti teruletrol hogy torlom az adatokat, ha a session lejart, es az adata mar nem lenne szukseg? kapok valami ertesitest, hogy lejart egy session es torolhet o adatbazisbol a megfelelo adat?
koszi,
Zsolt
- 1082 megtekintés
Hozzászólások
Mindenek elott a SESSION ertelme az az, hogy mindenenik egy bizonyos bongeszohoz tartozik (php alapbol a bongeszo cookie-ba tarolja a session id-t es a session_start() automatikusan megnezi, hogy mar letezik az adott lekereshez session, ha igen betolti azt, ha meg nem akor letrehozza.
A Session lenyege az, hogy azt csak a megadott session_id-vel lehet elocsalni, igy konyen es biztonsagosan meg lehet kulomboztetni a felhasznalokat. Te azt szeretned, hogy egy bizonyos lekeres eseten vegig tudd pasztazni az osszes session-t. Eleg fura megoldas lenne, ha jol tudom a session-ok a tmp konyvtarban tarolodnak, de abban nem vagyok biztos, hogy mindig az aktualis session kep latszik, mivel valoszinu optimalisabb mukodes miatt a gyakoribbakat nem mindig irja ki a tmp-ben, hanem bent tartja a memoriaban (remelem nem montam nagy hujeseget).
Ha megoldhato szerintem inkab azokat az adatokat tarold adatbazisban es onnan dolgozz veluk, mert a session-okal babralni ien modon nagyon csunya dolog.
_______________________________________________________
UBUNTU 8.04 Rock's!
Type cat /vmlinuz > /dev/audio to hear the Voice of God.
- A hozzászóláshoz be kell jelentkezni
Valoban, eleg nagy biztonsagi res lenne, engedni a hozzaferest mas sessionokhoz.
Ellenben a problema adott, nevezetesen, hogyan lehet megoldani a kozponti tarbol a torlest ha egy session lejar, ugyanis a _SESSION hasznalatat nem lehet kidobni.
zsolt
- A hozzászóláshoz be kell jelentkezni
Miért akarod a sessionokat a szerveren tárolni? Nagy forgalmú oldal esetén erősen befolyásolhatja a performanciát. Jó az ott a felhasználó oldalán cookie -ban tárolva. Mikor létrehozod a session -t(cookie -t), megadod, hogy meddig érvényes és ha eltelik ez az idő, és a felhasználó ismét rátéved az oldaladra, akkor törlődik a régi cookie és tárolódik az új.
- A hozzászóláshoz be kell jelentkezni
Sok oldalt felnyomtak már, ahol ugyanígy gondolták.. persze lehet, csak tudni kell mit szabad cookieban tartani és mit nem, és hogyan.
- A hozzászóláshoz be kell jelentkezni
Ha a session cookie-ban taroltad, akkor a session cookie-t kell torolni, ill. uresre allitani.
Pl.
setcookie(session_name(), session_id(), 1, '/');
php.ini-ben be lehet allitani, hogy a session-oket megadott ido utan automatikusan torolje egy garbage collector.
- A hozzászóláshoz be kell jelentkezni
adok egy konkretabb problemat.
egy session bejelolt valami opciot (lefoglalja maganak - ez a helyes elkepzes), az oldalon. Ekkor az a feladat, hogy a tobbi session szamara az az opcio meg csak meg se jelenjen, mert a egy masik lefoglalja.
A session megszunesekor viszont fel kell szabaditani a foglalast, hogy ujra barki lefoglalhassa maganak.
ezt a problemat kene megoldani.
Egy adott ido utan meg nem torolhetem, hisz nem biztos, hogy a session is megszunik annyi ido utan. tehat valaahogy ertesulnom kene, hogy a session megszunt es felszabadithato a foglalas.
eddig tehat nincs megoldas erre, ugy latom.
zsolt
- A hozzászóláshoz be kell jelentkezni
Adatbázisban tárold le, hogy mi az ami lefoglalt és mi az ami nem.
- A hozzászóláshoz be kell jelentkezni
Egyetertek, ezt a problemat ne session szinten probald megoldani.
- A hozzászóláshoz be kell jelentkezni
Én ezt egyedi cuccokat áruló webáruháznál úgy oldottam meg, hogy az adott termék "foglalt" státuszba került és nem látszott a többi vevőnek.
Innentől te döntesz, hogy mit csinálsz:
- egy bizonyos oldal letöltésekor egy rutinnal ellenőrzöd, hogy van-e pl. 2 óránál régebb óta foglalt termék és ha van azt "felszabadítod"
- naponta 1x egy karbantartó rutinnal csinálod meg u.e.-t
- T percenként hivogatsz egy scriptet, ami meghívja a karbantartót
- satöbbi.
- A hozzászóláshoz be kell jelentkezni
Szerintem arra nincs a PHP-ben lehetoseg, lekezeli ezt automatikusan.
Csak az eppen aktualisat tudod a session_destroy-al.
Sajnos nem tudom, hogy letezik e egyaltalan valamein lehetoseg (a tippem az, hogy nem) arra, hogy kozveltelenul manipulalni tudd az osszes session-t a rendszerben.
Teljesen folosleges lenne, sot oriasi biztonsagi rest okozna.
_______________________________________________________
UBUNTU 8.04 Rock's!
Type cat /vmlinuz > /dev/audio to hear the Voice of God.
- A hozzászóláshoz be kell jelentkezni
Én mysql-ben, vagy pgsql-ben szoktam tárolni a sessiont, ott meg lefuttatok naponta egy lekérést, amely törli a lejárt session-öket.
Vagy olyat is láttam, hogy az egyik session-kezelő rutinba írták be, de az olyan fapad érzés, meg overhead.
- A hozzászóláshoz be kell jelentkezni
"ott meg lefuttatok naponta egy lekérést, amely törli a lejárt session-öket."
megegyszer: nem a tarolassal van a gond, hanem hogy hogyan torlom, azaz, hogy hogyan ertesulok, hogy mely sessionok jartak le. mibol tudom meg, hogy ez a session lejart, de egy masik meg nem.
zsolt
- A hozzászóláshoz be kell jelentkezni
Egyszerű: az adatbázisban rögzítem a lejárat idejét.
- A hozzászóláshoz be kell jelentkezni
Akkor tisztazzunk valamit, lehet en tudom roszul.
mondjuk meg van adva, hogy 5 sec utan lejar. ez ha jol gondolom, idle ido, tahat valoban lejar az utolso aktivitas utan 5seccel. de ha 3 secenkent aktivitas van, akkor akarmeddig fenttarthato a sesson.
eppen ezert nem lehet tudni mikor jar le a session. mindenkepp kell egy event ra, csak kerdes, detektalhato ez valahogyan is?
zsolt
- A hozzászóláshoz be kell jelentkezni
Egy megoldas
Az ido masodpercben szerepel
( Jelenlegi ido - Utolso lekeres ) > 5
_______________________________________________________
UBUNTU 8.04 Rock's!
Type cat /vmlinuz > /dev/audio to hear the Voice of God.
- A hozzászóláshoz be kell jelentkezni
Minden egyes esetben, amikor "aktív" (azaz kommunikációt kezdeményezett a szerverrel), frissítem a sessiont, és a lejárat idejét is.
- A hozzászóláshoz be kell jelentkezni
Ellenben a problema adott, nevezetesen, hogyan lehet megoldani a kozponti tarbol a torlest ha egy session lejar, ugyanis a _SESSION hasznalatat nem lehet kidobni.
Ahogy gondoltam, letezik egy garbage collector, ami automatikusan elvegzi ezt, miutan egy session lejart.
Erre mindjart letamad valaki, ezert valaszolok is ra: hogy s mi van az 0 lejarati idovel? Azt is torli egy megadott idle ido eltelte uran.
_______________________________________________________
UBUNTU 8.04 Rock's!
Type cat /vmlinuz > /dev/audio to hear the Voice of God.
- A hozzászóláshoz be kell jelentkezni
hogy tudna a memoriaban tarolni a sessionoket, ha a php csak oldalkeresnel fut?
valahova ki kell irnia...
zsolt
- A hozzászóláshoz be kell jelentkezni
Igen, csak ep azt nem vetted figyelembe, hogy a SESSION tar elerese aszinkron!
Ez azt jelenti, hogy lehet belepiszklasz a sessionbe mikozben azt a sessiont egy masik php process mar beolvasta es dolgozik vele, majd ameik utoljara irja ki az lesz a vegleges, es a masik mintha ott sem lett volna.
Nem tudom most mar ertetted e, hogy miert fordul elo az, hogy egy session aktualis allapota nincs mindig szinkronban a hattertarra kimentettel.
_______________________________________________________
UBUNTU 8.04 Rock's!
Type cat /vmlinuz > /dev/audio to hear the Voice of God.
- A hozzászóláshoz be kell jelentkezni