[php] Wat kan je wel en niet met custom php sessions

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Op dit moment zit ik te overwegen mijn file-based php sessions in te leveren voor mysql-based. Zo kan ik makkelijker die data aanpassen,verwijderen en eventueel bewaren.

Nu zie ik verschillende mogelijkheden:

- een eigen sessionHandler schrijven, die volledig met cookies en een database werkt. Als cookies niet werken wordt de SID (session_id) doorgegeven via een form of de url.

- met session_set_save_handler de php sessions die normaal naar /tmp/ gaan, nu naar de database schrijven.


Van die 1e optie zie ik het nut niet in, aangezien ik php4 draai, en niet op php3 hoef te draaien.

Die 2e optie is als ik het goed begrijp, niet meer dan het wegschrijven van het session object naar 1 veld in de db. De data wordt dus niet gesplitst en niet in verschillende velden ingevoerd.

Dat laatste wil ik eigenlijk wel, want ik voer altijd dezelfde variabelen in de session in. Ik zie echter niet hoe ik dat moet splitsen, omdat ik ook niet echt duidelijk op internet kan vinden wat session_set_save_handler nou verwacht van die functies die je moet declareren.

Kan iemand mij dit duidelijk maken?

Ik heb btw, al het 1 en ander bekeken, maar dit maakt de dingen niet veel duidelijker:
http://www.phpbuilder.com/columns/ying20000602.php3?page=1
http://www.devarticles.com/art/1/171/3

Deze gaan er alleen allebei vanuit dat je de session data in 1 veld wilt opslaan...

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

  • Joker
  • Registratie: Juli 2001
  • Niet online

Joker

 

Kijk eens op de site van PHP. Daar staat ook een MYSQL-voorbeeld (bij de opmerkingen onderaan).

http://nl.php.net/manual/...sion-set-save-handler.php

Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Ja, dit heb ik ook gezien, maar ook hier worden de de serialized string (object) naar 1 veld in de database geschreven.

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function open($savepath,$session_name) {
  // sla $savepath en $session_name ergens op (indien gewenst)
  // open eventueel benodigde zaken (maar databaseconnectie is waarschijnlijk al open)

  // geef resultaat(boolean) terug
  return true;
}

function read($id) {
  // lees de sessiedata van voor id $id uit, bv
  // SELECT session_data FROM sessions WHERE session_id=$id
}

function write($id,$sess_data) {
  // schrijf de sessiedata naar db voor $id, bv
  // (hiervoor moet session_id een UNIQUE veld zijn)
  // REPLACE INTO sessions (session_id,session_data,timestamp_access) VALUES ($id,'".mysql_escape($sess_data)."',NOW())
}

function close() {
  // sluit eventueel geopende zaken

  // geef resultaat (boolean) terug
  return true;
}

function destroy($id) {
  // verwijder de data van $id uit de database, bv
  // DELETE FROM sessions WHERE session_id=$id

  // geef resultaat (boolean) terug
  return true;
}

function gc($maxlifetime) {
  // verwijder oude sessies, bv
  // DELETE FROM session WHERE timestamp_access<date_sub(now(),interval $maxlifetime second)

  // nja je snapt het
  return true;
}

session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");


je kan dus bij read/write ook andere informatie in de tabel erbij opslaan, zoals IP en aanmaak timestamp van de sessie.

ook kan je de session_data gzippen om meer data toe te staan dan 64k (maximale querygrootte in PHP dacht ik) en het verkeer met de dbserver iets te beperken.

edit/ps: je kan de data geloof ik via een unserialize wel splitsen.

[ Voor 6% gewijzigd door Verwijderd op 07-09-2003 17:11 ]


Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Hmm, ik zit net te denken, misschien kan je in read() wel doen:

PHP:
1
2
3
4
5
6
7
function read($id) {
  $result = $mydb->execute_query("SELECT session_id, user_id, user_ip, 
session_created,enz FROM sessions where session_id = $id";

  $object = $mydb->fetch_row_object($result);
  return serialize($object);
}


En met het updaten: unserialize en dan de velden appart aanpassen.

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

Verwijderd

dat gaat mis als zodanig;

je serialized dan 1 object met als velden de velden uit de database (incl. session_id en session_created).

als het in $_SESSION zetten van die sessie variabelen niet boeit, dan kan het, maar moet je wel mysql_fetch_array gebruiken :)

Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
mysql_fetch_array?

ik dacht dat php van die functie een serialized object terug wil?

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

Verwijderd

oh sorry het gaat sowieso niet zo makkelijk; het unserializen geeft je variabelen die niet perse string hoeven zijn (maat bv een array, object of NULL). je moet de velden ook individueel serializen/deserializen.

ook moet je mysql_fetch_array de parameter MYSQL_ASSOC meegeven.

Acties:
  • 0 Henk 'm!

Verwijderd

hij serialized de $_SESSION[] array gewoon botweg.

Acties:
  • 0 Henk 'm!

Verwijderd

waarom wou je nou precies splitsen eigenlijk? als je de individuele variabelen wilt zien, is het dan niet makkelijker een sessie-overzichtspagina te klussen die de hele sessie tabel uitleest en de session_data ontleedt?

Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Ik wil het splitsen, omdat ik het wil synchroniseren met de custom sessions van phpBB, zodat ik nog maar 1 sessions tabel heb. En dat als je op de ene inlogd, je dan ook bij de andere binnen bent.

Die zijn op bovenstaanden manier 1 geimplementeerd, maar ik heb geen zin om mijn site op die manier om te bouwen.

Ik heb nu het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
print read("5e3264c309385f2b2c5d2c2ba5b28efa");


function read($id) {
  global $mydb;
  $result = $mydb->execute_query("SELECT session_id, session_user_id, 
session_ip, session_logged_in, gebruikersnaam FROM sessions LEFT JOIN 
gebruikers ON gebruikers.id = sessions.session_user_id WHERE session_id 
= '$id'"); 
  $object = $mydb->fetch_row_object($result); 
  return serialize($object); 
}


Volgens mij doet ie het nu prima. Hij schrijft een object weg, en die moet dan in straks weer bekend worden als ik session_start() aanroep.

[ Voor 65% gewijzigd door maartenvdv737 op 07-09-2003 17:44 ]

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Ik wil dit trouwens eerst even testen.

Is het mogelijk om met de setting:

session.save_handler = user

Per directory aan te geven wat je wilt?

Dus in de root bijvoorbeeld overrulen naar: php_value session.save_handler = files
en in een sub folder: php_value session_save_handler = user

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Het werkt :-)

[ Voor 96% gewijzigd door maartenvdv737 op 07-09-2003 18:16 ]

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Grr, het werkt nog niet goed...

de sess_data die ik binnen krijg in write() ziet er zo uit: session_logged_in|i:1;

Als ik nu doe: print_r(unserialize(sess_data)); dan print ie niets.

Weet iemand waarom?

[ Voor 3% gewijzigd door maartenvdv737 op 07-09-2003 21:16 . Reden: eindelijk gelukt. ]

Ik blijf er iig vrij nuchter onder....

Pagina: 1