Avatar billede marleone Nybegynder
06. april 2008 - 15:02 Der er 15 kommentarer

Glemme sessions i MySQL database

Hej eksperter.

Jeg har prøvet at lave et script der gemmer sessions i databasen, fordi min kunde har et webhotel, hvor mange websites deler den den samme sessions mappe.. bla bla bla..

Mit problem er, at de sessions der bliver oprettet i databasen, aldrig bliver slettet igen. Når en person f.eks. bliver logget ud, så bliver dataen rigtig nok tømt, men desværre aldrig slettet?!

Koden er som følger:

//Define the functionality needed when session destroys.
//This function takes one argument: sessionID.
//This function destroys the session.
function destroy_session($id)
{
    global $conn;
   
    $id = mysqli_escape_string($conn, $id);
   
    $result = @mysqli_query($conn, "DELETE FROM sessions WHERE id='$id'");
   
    $_SESSION = array();
   
    return @mysqli_affected_rows($conn);
}

//Define the functionality needed when session cleans.
//This function takes one argument: expiring date (in seconds).
//This function destroys the session.
function clean_session($expire)
{
    global $conn;
   
    $expired = time()-$expire;
    $expired = mysqli_escape_string($conn, $expired);
   
    $result = @mysqli_query($conn, "DELETE FROM sessions WHERE last_accessed < FROM_UNIXTIME($expired)");
   
    return @mysqli_affected_rows($conn);
}

På forhånd tak...
Avatar billede jakobdo Ekspert
06. april 2008 - 21:17 #1
Hvad mener du med tømt og slettet ?
Snakker vi i databasen eller selve session'en ?
Avatar billede marleone Nybegynder
06. april 2008 - 21:26 #2
Feltet med data bliver tømt/slettet i rækken i databasen, men selve rækken bliver aldrig slettet. Det vil sige, $_SESSION['user'] indeholder ikke mere et brugerid, men selve $_SESSION (brugerens unikke sessionid) bliver aldrig slettet igen.

Jeg har selvf. tjekket diverse eksempler på google, men ingen af dem kan få session rækkerne slettet i databasen...
Avatar billede olebole Juniormester
06. april 2008 - 22:14 #3
<ole>

Jeg kan ikke finde hoved og hale i, hvad du mener. Såvidt jeg kan se, indeholder dit spm. og kommentar en masse selvmodsigelser. Jeg tror, du bliver nødt til at uddybe lidt mere præcist  =)

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
06. april 2008 - 22:17 #4
Jeg forstår det heller ikke, men jeg er bare en gammel mand. Bliver clean_session nogensinde kaldt?
Avatar billede olebole Juniormester
06. april 2008 - 22:24 #5
- og så giver det ikke mening at undertrykke fejlmeddelelser, når man debugger ... tværtimod!

Ret dine MySQL-kald til noget à la:
    $result = mysqli_query($conn, "DELETE FROM sessions WHERE id='$id'") or die (mysql_error());

Altså fjern dit snabelA og tilføj die-kommandoen  ;o)
Avatar billede olebole Juniormester
06. april 2008 - 22:26 #6
- og da du jo bruger mysqli, skal du naturligvis skrive:
    $result = mysqli_query($conn, "DELETE FROM sessions WHERE id='$id'") or die (mysqli_error());
Avatar billede erikjacobsen Ekspert
06. april 2008 - 22:41 #7
Nu skal du ikke fortælle ham halve sandheder om mysqli - den der $id ligner en vandloppe  på cykel - malplaceret (selv om det måske virker). Men lad os se om det kan komme til at virke, så kan vi altid gøre det rigtigt.
Avatar billede marleone Nybegynder
06. april 2008 - 22:53 #8
Okay jeg prøver igen.

Jeg har 3 felter i tabellen sessions: id | data | last_accessed

1) En bruger kommer ind på siden og et sessionid og en dato bliver sat ind i databasen, data feltet er tomt fra start.

2) Brugeren logger ind, og der kommer et brugerid ind i datafeltet.

3) Brugeren logger ud igen, og data feltet bliver tømt. Derefter forlader brugeren som regel siden helt.

4) Rækken der blev oprettet da personen ankom til siden, burde blive slettet efter 20 min. inaktivitet, men det gør den aldrig...

Selvf. kalder jeg funktionen clean_session, jeg har bare ikke sat hele koden ind, da jeg ikke mente det havde relevans.

Jeg bruger: session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session', 'destroy_session', 'clean_session');

og derefter kalder: session_start();

Jeg kopieret lige koden fra den version der ligger på nettet, derfor @ foran.. den lokale version har ikke @ :-)

Håber dette indlæg bedre forklarer mit problem.
Avatar billede marleone Nybegynder
06. april 2008 - 23:11 #9
Undskyld fejlen i overskriftet, det er søndag og det skulle gå lidt stærkt :) Der skal selvf. stå Gemme sessions i MySQL database...

"den der $id ligner en vandloppe på cykel - malplaceret (selv om det måske virker)" - ?? er det en form for hardcore programmerings lingo?
Avatar billede erikjacobsen Ekspert
07. april 2008 - 08:03 #10
Det med vandloppen kommer senere.

Sessionen bliver ikke slettet efter præcis 20 minutter. Den bliver slettet på et senere tidspunkt. Der står noget i php.ini om det:


; Percentual probability that the 'garbage collection' process is started
; on every session initialization.
session.gc_probability = 1

Dvs. for ca. hver 100 forespørgsel ryddes der op. Hvis der ikke er trafik, så kan det vare længe.
Avatar billede erikjacobsen Ekspert
07. april 2008 - 08:04 #11
Ikke for hver 100 forespørgsel ... men for ca. for hver 100 ny session.
Avatar billede marleone Nybegynder
07. april 2008 - 09:34 #12
Ahh okay. Jeg havde godt læst lidt om sandsynligheden for, hvornår en session ville blive slettet, men jeg troede godt nok det ville ske noget oftere.

Jeg har selvfølgelig tømt hele tabellen, når der var cirka nogle og halvtres rækker, og derfor har jeg aldrig været nær de 100 rækker før.

Kan man indstille probability lavere på et webhotel, og giver det overhovedet mening?

Jeg havde lidt håbet man kunne lave en online counter på sin session tabel, men det kan jeg vist godt glemme.
Avatar billede erikjacobsen Ekspert
07. april 2008 - 11:01 #13
Du kan nok ikke gøre noget på et webhotel (spørg). Jo, du kan tælle dem, der er mindre end 20 minutter.
Avatar billede marleone Nybegynder
07. april 2008 - 11:29 #14
Ja det er jo også rigtigt.. Tusind tak for hjælpen Erik. Opretter du lige et svar?
Avatar billede erikjacobsen Ekspert
07. april 2008 - 11:46 #15
Jeg samler slet ikke på point, tak. Man få checket at der faktisk slettes sessioner på et tidspunkt.
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