phpbar.de logo

Mailinglisten-Archive

[php] session_set_save_handler

[php] session_set_save_handler

Frank Rasche phpml at raschesweb.de
Don Okt 7 16:24:10 CEST 2004


Hallo Andreas,

Andreas Heigl schrieb am Donnerstag, 7. Oktober 2004 um 13:31:

> Aus Performance-Gründen (Die Session-Dateien kriegen schon mal 5-7 MB)
> wollte ich das ganze jetzt auseinanderklamüsern und dachte locker bei mir
> 'mensch, schreib dir doch einen session_set_save_handler'.

Wird nicht ganz einfach, dein eigener Sessionhandler (write) bekommt die
Sessiondaten bereits als serialisiertes Array.
Die müsstest du beim Schreiben (Write-Handler) via unserialize() auseinanderklamüsern ;) und in
getrennte DB-Felder bspw. eintragen.

> Aber wann genau wird dann welche Funktion aufgerufen? Kann eine solche
> Funktion dann einzelne Session-Variablen getrennt abrufen?

Nicht wirklich.
Der Read-Handler wird nach dem Open-Handler (bei PHP dann
session_start()) aufgerufen, holt den kompletten Inhalt der Session und
erwartet ihn als serialisiertes Array.
Danach stehen dir alle Sessiondaten als assoziatives Superglobal-Array
($_SESSION) zur Verfügung.

Am besten schaust du dir nochmal das Beispiel auf
http://php.net/function.session-set-save-handler.php

an. Das zeigt nachgebildet, wie PHP seine Session-Daten verwaltet.

> (Dann könnte ich jede menge zeug in der Datenbank haben, würde aber fürs
> einlesen momentan nicht benötigter Sessionvariablen nicht unnötig zeit
> verlieren)

Entweder definierst du deine eigenen Session-Handler in einer Klasse
und bestimmst vor session_start() (also dem Aufruf der
Sessionhandler), welche Variablen du brauchen wirst.
D.h. du müsstest deinem Session-Read-Handler von vorneherein als
z.B. Eigenschaft deiner Session-Klasse mitteilen,
welche DB-Felder er auslesen und das ganze als
serialisiertes Array zurückgegeben soll.
Beim Write-Handler müsstest du dann wie oben beschrieben aber die
Sessiondaten erstmal trennen.

Oder du schreibst eigene Session-Management-Klasse und verzichtest auf die
PHP-Funktionen session_start(), session_id(), trans_sid usw. sowie die
$_SESSION-Superglobals.

D.h. deine Session-Klasse müsste dann eine Session selber registrieren,
verwalten und schliessen.
Dann allerdings musst dich auch selbstständig um die komplette GC-Organisation kümmern.
Aber du könntest deine Daten speichern wie und wo du lustig bist ;)

> Und wie muss dann die Datenbankstruktur aussehen?

Im Prinzip benötigst du rudimentär nur ein Feld für die Session-ID und
ein Textfeld für die Sessiondaten. Günstig ist sicher noch ein
Timestamp damit man zeitabhängig einen GC-Lauf starten kann und was du in deinen
eigenen Handlern noch so brauchst.

> Und gibt¹s da nicht was von ... PEAR?

Das HTTP-Session-Paket aus PEAR hilft dir nicht wirklich weiter, weil sie
ebenfalls auf den PHP-Sessions aufsetzt und lediglich ein paar
Zusatzfunktionen wie isExpired(), isIdle() usw. aufruft.

HTH
Frank



php::bar PHP Wiki   -   Listenarchive