Avatar billede heyn Nybegynder
06. februar 2006 - 13:12 Der er 13 kommentarer og
1 løsning

Slettes sessions-objekt hvis browseren lukkes?

Hej alle.
Jeg må have misforstået noget om sessioner - men jeg ved ikke hvad.
Jeg har lavet følgende 3 test-scripts

test_start.php:

<?php session_start(); ?>
<html><head></head><body>
<?php
echo "session_name() = ".session_name()."<br>\n";
echo "session_id() = ".session_id()."<br>\n";
?>
<form action="test_dest.php" method="post">
<?php echo "<input name=\"".session_name()."\" value=\"".session_id()."\" type=\"hidden\">"; ?>
<input value="opdater" type="submit">
</form></body></html>

test_dest.php:

<?php session_start(); ?>
<html><head></head><body>
<?php
echo "session_name() = ".session_name()."<br>\n";
echo "session_id() = ".session_id()."<br>\n";
?>
<form action="test_dest2.php" method="post">
<?php echo "<input name=\"".session_name()."\" value=\"".session_id()."\" type=\"hidden\">"; ?>
<input value="opdater" type="submit">
</form></body></html>


test_dest2.php:

<?php
session_start();
echo "session_name() = ".session_name()."<br>\n";
echo "session_id() = ".session_id()."<br>\n";
session_destroy();
?>

Hvis jeg kører siderne fra start til slut fungerer alt godt. Mit sessions-objekt C:\Programmer\PHP\sessiondata\sess_SESSIONSID slettes når test_dest2.php køres.
Hvis jeg derimod lukker browseren når test_dest.php vises slettes objektet ikke.
Burde dette ikke ske?
Hvis ikke - har nogen et forslag til hvordan det skal lade sig gøre?

Mvh Christian
Avatar billede barklund Nybegynder
06. februar 2006 - 13:18 #1
Serveren har jo ingen chance for at vide, om du lukker din browser eller ej. Og hvorfor skal den også vide det. Klienten sletter jo sin cookie, når browseren er lukket (da det er en cookie uden levetid og derfor en session cookie), og derfor kan klienten ikke genoptage sessionen.

Serveren vil da holde et register over, hvornår en given session sidst er brugt, og hvis det er mere end (en eller anden) ini-indstilling siden, så slettes sessionen.

Det opfører sig altså ganske som ventet - men du har ikke nogen grund til manuelt at sende session_name og session_id rundt mellem siderne - det sørger din cookie for :)

--
Morten Barklund
Avatar billede heyn Nybegynder
06. februar 2006 - 13:48 #2
Hej Barklund
Jeg bruger ikke cookies.
Forklaringen på hvorfor jeg videresender PHPSESSID kan ses på http://www.eksperten.dk/spm/685031
Jeg bruger PHPSESSID til at teste om der findes et session-objekt ved at gemme PHPSESSID i DB når en sessions startes.

Problemet drejer sig om at jeg på en el. anden måde skal give andre brugere begrænset adgang hvis en bruger allerede kører en session på siden. Dette skal ske for at undgå konflikter i brugernes handlinger.
Nogle typer af brugere skal have anvendelses ret i flere timer ad gangen uden at foretage opdatering mens andre kun skal have rettighed i 15 min uden opdatering. Derfor kan jeg ikke sætte session.gc_maxlifetime mindre end 7200.
Det er lang tid at blokere siden hvis en bruger kun skal anvende den i 5 min.

Er der ingen mulighed for at løse et problem af den art?

Mvh Christian
Avatar billede barklund Nybegynder
06. februar 2006 - 13:54 #3
Det lyder forholdsvist mærkeligt bygget op. Og nej, serveren kan aldrig vide, om det faktum, at min klient ikke sender noget til serveren skyldes, at jeg er sidder og kigger på en side i lang tid, har ladet min browser stå eller har lukket browseren - alt sammen betyder jo netop, at jeg ingenting sender til serveren. Du kan lave det med en decideret login-logout-funktionalitet, eller endnu værre noget grimt noget med en ekstra frame, der reloades hvert minut. Noget lidt pænere ville nok være en ekstra frame med en lille klient i Java eller Flash, der blot holdt en forbindelse åben til en socket-server i php, som når forbindelsen blev lukket release'de session.

Men jeg tror det skal tænkes en del igennem først :)
Avatar billede heyn Nybegynder
06. februar 2006 - 14:27 #4
Ja, jeg bruger faktisk iframe.
Og ja - jeg anvender javascript til at foretage opdatering hvert 5 min. hos dem der ikke ejer session således at de overtager sessionen når den frigøres. Opdatering sikrer også at session afbrydes hvis den der ejer session ikke bruger siden i 2 timer.
Mit eneste problem er faktisk at sikre at der ikke opstår en slaks dead-lock i flere timer hvis siden lukkes.
Jeg kender til Java, men ikke i forbindelse med socket-server som jeg overhovedet ikke ved hvad er.
En case på mit problem kunne være at 2 læger ikke må ordinere 2 slags medicin i den elektroniske patientjournal samtidig, men at den ene inden for et rimeligt tidsrum skal kunne overtage arbejdet hvis den anden bliver kaldt til haste operation.
Jeg må nok bide i det sure æble og lave 2 timers blokkering og så håbe på at situationen ikke opstår for mange 'hasteoperationer' i mit system.

Mvh Christian
Avatar billede barklund Nybegynder
06. februar 2006 - 14:31 #5
Det er forhåbentlig ikke en elektronisk patientjournal? I så fald ville jeg nok lave det lidt større og nok slet ikke vælge php men sprog, der er lidt mere "modne" :)
Avatar billede heyn Nybegynder
06. februar 2006 - 14:39 #6
Nej det er ikke en patient-journal. Det er der netop nogen der er blevet færdig med efter 10 års arbejde. Det er såmænd bare et lille produktionsstyringssystem der kører internt på domænet mellem IT-afdelingen og dens brugere.
Mvh. Christian
Avatar billede barklund Nybegynder
06. februar 2006 - 14:47 #7
Hehe, great :)

Men php er ikke særlig god til den slags. Skal man lave noget i den stil, så er man nødt til at bruge et program, der har en live forbindelse til serveren - for eksempel med sockets implementeret i en Java- eller Flash-frontend og en Java-server.

:)

--
Morten Barklund
Avatar billede heyn Nybegynder
06. februar 2006 - 15:06 #8
Aha
Men hvad ved du om adgangsrettighed til IIS-servere.
Jeg bruger integreret windowsgodkendelse da systemet kører på Active Directory netværk. Det medfører jo at man skal udføre login hvis man ikke kører Explorer.
Med mine andre sider går det fint.
Når jeg kører ovenstående script fungerer det fint i FireFox hvis jeg logger ind på serveren med mit eget brugernavn, men hvis jeg anvender mit testbrugernavn går der kluder i tingene.
Når jeg åbner siden får jeg følgende fejl:
Warning: session_start() [function.session-start]: open(C:\programmer\PHP\sessiondata\sess_23815de7a6ecd02f873af00e21a43fec, O_RDWR) failed: Permission denied (13) in C:\produktion.hum.ku.dk\WEB\ldap\test_start.php on line 1
Avatar billede heyn Nybegynder
06. februar 2006 - 15:09 #9
Hov jeg klikkede lidt hurtigt på send.
Problemet er altså linie 1 <?php session_start(); ?>
Hvad er permission denied (13)?
Avatar billede barklund Nybegynder
06. februar 2006 - 15:14 #10
No idea - ved intet om IIS :)
Avatar billede heyn Nybegynder
06. februar 2006 - 15:34 #11
I øvrigt.
Hvis session ikke afsluttes på server når jeg lukker browseren er det unødvendigt at bruge session. Hele ideen går tabt. Så kan jeg lige så vel gemme brugernavn og timestamp på den sidste bruger, som blokkerede siden, i db.
Så blev det problem 'løst'.
Tak fordi du åbnede mine øjne for sessions begrænsninger.
Smid et SVAR.
Mvh Christian
Avatar billede barklund Nybegynder
07. februar 2006 - 09:27 #12
Well, helt i orden :)
Avatar billede heyn Nybegynder
07. februar 2006 - 13:39 #13
Jeg valgte at lave en skjult iframe hvor jeg hvert 5. min kalder update.php. Den gemmer tidspunkt for kald af update.php i DB. Hvis DB viser at der ikke har været kaldt i 5 min. er siden ikke længere i anvendelse.

Mvh Christian
Avatar billede barklund Nybegynder
07. februar 2006 - 14:22 #14
Tark for points :)
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