17. december 2009 - 17:58Der er
16 kommentarer og 2 løsninger
Session-exist spørgsmål
Hej. Jeg er ved at bygge et forum og har et spørgsmål vedr. sessions. Er der en måde hvorpå jeg kan tjekke om en session med en et givent session-id eksisterer længere?
Jeg har en tabel med info om brugeres aktivitet uanset om de er logget ind eller ej som indeholder info om tidspunktet for deres sidste aktivitet (klik) og sådan, samt et felt i bruger-tabellen der hedder "loggedIn" som bliver sat til 1 når de logger ind og 0 når man manuelt logger ud.
Men hvad gør jeg når brugerne lukker deres browser-vinduer, og deres session så bliver destrueret. Der skal jeg jo gerne have sat "loggedIn" til 0 :)
Og jeg vil helst ikke ud i noget med at jeg logger dem ud hvis ikke de har været aktive på siden i noget tid, f.eks. 30 minutter. Så længe de er på siden i deres browser og session-timeouten sat i php.ini ikke er nået, skal de være registreret som "loggedIn".
Har desuden sat php.ini-direktivet session.cookie_lifetime til 1800 sekunder så deres cookie forsvinder jo efter en halv time, og de får genereret et nyt session-id som jeg ser det?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Slettet bruger
17. december 2009 - 18:05#1
Har desværre ikke tid til at skrive et fuldt svar (skal afsted om et øjeblik), men ville blot sige, at du ikke skal regne med, at bare fordi du har sat session.cookie_lifetime til 1800 sekunder, så forsvinder cookien efter det. Brugere kan selv ændre i deres cookies, f.eks. sætte dens udløbstid til "Aldrig" og derved forblive logget ind så længe de vil. Derfor skal du også ud i "noget med at jeg logger dem ud hvis ikke de har været aktive på siden i noget tid", og tiden kunne jo så f.eks. være 1800 sekunder, ligesom cookien.
Og du har helt ret self med det med cookies, det var blot en tanketorsk af mig.
Synes godt om
Slettet bruger
17. december 2009 - 19:50#4
En session kan "destrueres" med funktionen session_destroy();, men det er ikke muligt at destruere den, når brugeren lukker sin browser (pga. http-protokollen, noget indviklet stads). En mulighed kunne til gengæld være, at sætte brugerens cookie til at forsvinde når vedkommende lukker browseren, session.cookie_lifetime = 0;, og så lade sessionerne udløbe i af sig selv i PHP. Derved bliver brugeren logget ud når vedkommende lukker sin browser, eller når vedkommende har været inaktiv i et bestemt stykke tid (typisk 15 minutter).
Okay ja den havde jeg faktisk luret, jeg tror bare jeg er dårlig til at forklare mig.
I bund og grund har jeg en tabel med session-id'er. Når jeg tester på hvornår der sidst har været aktivitet med de id'er, vil jeg gerne destroye sessions med de id'er hvis de er over f.eks. 30 minutter gamle :)
Synes godt om
Slettet bruger
17. december 2009 - 20:07#6
Kan du ikke bare tjekke hver gang brugeren henter en side:
Nej, efter at have læst dit spørgsmål igen, kan jeg kan godt se problemet i ovenstående. Bare ignorer #6.
Synes godt om
Slettet bruger
17. december 2009 - 20:29#8
En anden mulighed kunne være at køre koden fra #6 på den session du ønsker at tjekke, men det kræver at du er i stand til at åbne (men ikke indlæse, det ville være katastrofalt) en anden session, tjekke en af variablerne, og så opdatere loggedIn afhængigt af hvad du finder. Det er muligt at "parse" en sessionsfil ved hjælp af funktionen session_decode($data);, men desværre sætter den variablerne direkte i $_SESSION-variablen, hvilket ville betyde, at den aktive bruger ville få adgang til disse.
Jeg vil prøve at lægge min hjerne i blød, og så se om jeg kan komme med en løsning.
$gammelSession = session_encode(); //Gemmer nuværende session i $gammelSession session_destroy(); //Sletter gammel session så vi ikke blander de to ting sammen.
$nySessionId = "S9J84NEL"; //Session-id (escaped) på den bruger der skal tjekkes. $nySessionData = file_get_contents(session_save_path() . "SESS_" . $nySessionId); //Skaffer session. Note: bør fejlsikres bedre. session_decode($nySessionData); //Henter session der skal tjekkes.
if ($_SESSION['sidsteAktivitet'] < time() - 1800;) { //Sæt loggedIn til false. } else { //Sæt loggedIn til true. }
Har en aktivitets-tabel. Den tjekkes jævnligt, om der brugere der ikke har været aktive indenfor de sidste 30 minutter. Hvis der er det, sættes de givne brugeres status til 0 i "loggedIn" feltet i bruger-tabellen (plus at feltet 'latestSessionId' sættes til en tom streng). Derefter slettes de givne entries i aktivitets-tabellen.
Når så en bruger der ikke har været aktiv indenfor de sidste 30 minutter, refresher sin side, tjekkes der om han har de session-vars der sættes når man logger ind (hvis han har det kan man formode at han ikke har haft sit browser-vindue lukket, i hvert fald ikke længe nok). Er session-vars der stadig, bruger jeg session_regenerate_id() til at bevare hans session-data, blot med et andet session_id.
Hvis så brugeren har haft sit vindue lukket længe nok til at han ikke har bevaret sine session-data, vil han blive opfattet som ikke logget ind, når han så igen går ind på siden med et nyt browser-vindue.
Umiddelbart den bedste løsning jeg lige kunne...
Synes godt om
Slettet bruger
17. december 2009 - 22:00#14
"- Har en aktivitets-tabel. Den tjekkes jævnligt, om der brugere der ikke har været aktive indenfor de sidste 30 minutter. Hvis der er det, sættes de givne brugeres status til 0 i "loggedIn" feltet i bruger-tabellen (plus at feltet 'latestSessionId' sættes til en tom streng). Derefter slettes de givne entries i aktivitets-tabellen."
Det var det jeg prøvede at (få dig til at) undgå. Hvis det skal være effektivt skal der tjekkes ca. en gang i minuttet, og i et forum med f.eks. 3.000 mennesker er det en ret ineffektiv måde at gøre det på. Men det virker :)
PHP bruger en meget uforudsigelig måde til at slette for gamle sessioner. Med variablen session.gc_maxlifetime kan du sikre dig at sessionen ikke bliver slettet før, men omvendt kan du ikke sikre dig at den faktisk bliver slettet på det tidspunkt.
Ja, men har svært ved at se ændre løsningen lige umiddelbart, end den jeg selv er kommet frem til må jeg sige. Har svært ved at se en mere effektiv metode...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.