Avatar billede kongfjong Nybegynder
17. december 2009 - 17:58 Der 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?

Så kort sagt: Hvad gør jeg her ?
Avatar billede 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.
Avatar billede kongfjong Nybegynder
17. december 2009 - 18:28 #2
Men kan jeg "destroye" de session-vars der er knytte til det specifikke session-id?
Avatar billede kongfjong Nybegynder
17. december 2009 - 18:29 #3
Og du har helt ret self med det med cookies, det var blot en tanketorsk af mig.
Avatar billede 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).
Avatar billede kongfjong Nybegynder
17. december 2009 - 19:58 #5
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 :)
Avatar billede Slettet bruger
17. december 2009 - 20:07 #6
Kan du ikke bare tjekke hver gang brugeren henter en side:

<?php
session_start();
if ($_SESSION['sidsteAktivitet'] < time() - 1800;) {
  //Sæt loggedIn til false
} else {
  $_SESSION['sidsteAktivitet'] = time();
}
(...)


Eller bruger du loggedIn uden for PHP?
Avatar billede Slettet bruger
17. december 2009 - 20:09 #7
Nej, efter at have læst dit spørgsmål igen, kan jeg kan godt se problemet i ovenstående. Bare ignorer #6.
Avatar billede 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.
Avatar billede kongfjong Nybegynder
17. december 2009 - 20:37 #9
Hehe tak :)
Avatar billede Slettet bruger
17. december 2009 - 20:41 #10
Hmm... Måske kan noget i denne stil bruges:

$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.
}

session_destroy(); //Fjerner indlæste session igen.
session_decode($brugerSession); //Henter gammel session igen.
(...)
Avatar billede Slettet bruger
17. december 2009 - 20:41 #11
session_decode($brugerSession); = session_decode($gammelSession);
Avatar billede kongfjong Nybegynder
17. december 2009 - 20:44 #12
Hvordan hitter man ud af hvor lang tid der går før en session udløber af sig selv i PHP?
Avatar billede kongfjong Nybegynder
17. december 2009 - 21:02 #13
Lige nu er jeg ude i noget med følgende løsning:

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...
Avatar billede 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.
Avatar billede kongfjong Nybegynder
18. december 2009 - 06:55 #15
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...
Avatar billede kongfjong Nybegynder
20. december 2009 - 00:34 #16
Lukket, men tak for forsøget kimsey, så lig et svar så deler vi :)
Avatar billede Slettet bruger
20. december 2009 - 16:11 #17
Jeg er ked af at jeg ikke kan hjælpe dig mere :(
Avatar billede kongfjong Nybegynder
20. december 2009 - 16:16 #18
Hehe det er helt ok ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester