Carsten_R: eigener Session-Handler PHP5

Hi,

ich arbeite an meinem cms und stehe nun vor dem Problem, dass man auf einem server, auf dem das später laufe soll, die session-lifetime nicht einstellen kann.

Nun will ich einen eigenen Mysql-basierten session-handler schreiben und so die php-ini umgehen.

Kann mir vielleicht irgendwer sagen wie ich das anfangen soll?

Danke schonma
Carsten

  1. Moin!

    ich arbeite an meinem cms und stehe nun vor dem Problem, dass man auf einem server, auf dem das später laufe soll, die session-lifetime nicht einstellen kann.

    In welcher Hinsicht ist das für dich nachteilig? Ist die Lebensdauer zu lang oder zu kurz?

    Nun will ich einen eigenen Mysql-basierten session-handler schreiben und so die php-ini umgehen.

    Kann mir vielleicht irgendwer sagen wie ich das anfangen soll?

    Du liest das Beispiel in der Doku und kopierst es. Dann schaust du, ob es funktioniert, und paßt es dann deinen Wünschen an.

    Es wird dir aber nicht unbedingt viel bringen - außer du läßt die Löschroutine komplett funktionslos und initiierst an ganz anderer Stelle einen eigenen Löschaufruf für alte Sessiondaten. Ob du dir damit viel unnötige Arbeit machst, hängt primär von der Antwort auf meine oberste Frage ab.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. n'abend,

      Vorweg: warum kann die session-lifetime nicht beeinflusst werden? Laut PHP Direktiven können session-Direktiven *überall* geändert werden. (in dem Fall sogar mittels ini_set() vor session_start() ;)

      Von welcher Direktive sprechen wir denn überhaupt?
      session.cache_expire - HTTP-Header (wie lange eine vom Server ausgelieferte Webseite vom Browser gespeichert werden kann, sofern der cache_limier das überhaupt zulässt)
      session.cookie_lifetime - Cookie (wie lange die SessionID in einem Cookie gespeichert werden darf)
      session.gc_maxlifetime - Interne Verarbeitung (wie alt Sessions sein müssen, bevor der [sehr unregelmäßig laufende] GarbageCollector aufräumt)

      Es wird dir aber nicht unbedingt viel bringen - außer du läßt die Löschroutine komplett funktionslos und initiierst an ganz anderer Stelle einen eigenen Löschaufruf für alte Sessiondaten. Ob du dir damit viel unnötige Arbeit machst, hängt primär von der Antwort auf meine oberste Frage ab.

      Soweit ich das überblicke, hat die "Löschroutine" nichts mit der session-lifetime zu tun. In der Doku von session_set_save_handler() ist eindeutig von "callback $destroy" die Rede. Das ist also die Funktion, die aufgerufen wird, wenn irgendwo im Script mal ein session_destroy() ausgeführt wird.

      session_set_cookie_params()  kann benutzt werden, um die Einstellungen des Session-Cookies zu überschreiben. (mache ich bspw. weil ich eine Session über alle sub-Domains hinweg gebrauchen will).

      In jedem Fall hat die Speicherung der Sessions in einer Datenbank aber nur dann einen Sinn, wenn man weitere Informationen abfragen können will. »Wer ist gerade online« würde mir da als erste "Sinnvolle" Abfrage in den Sinn kommen. Verschiebt man Sessions in einen anderen Kontext, möchte man aber definitiv sicherstellen, dass dieser der Belastung auch Standhält. MySQL's standard Tabellentreiber (MyISAM) nutzt Table-Locking. Sprich: für jeden Schreibzugriff wird die komplette Tabelle gesperrt. Reichlich dämlich, wenn man eigentlich viele kleine - eigentlich unabhängige - Pakete hat.

      weiterhin schönen abend...

      --
      Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
      sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
      1. Hello,

        session.gc_maxlifetime - Interne Verarbeitung (wie alt Sessions sein müssen, bevor der [sehr unregelmäßig laufende] GarbageCollector aufräumt)

        oder der sehr regelmäßig laufende Cron-Job auf einem Debian, wie wir neulich erst diskutiert haben.

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  2. Wenn das denn wirklich nötig sein soll?

    PHP macht nichts anderes als serialisierte Arrays mit den Sessioninhalten im temporären Verzeichnis abzulegen. Das kannst auch du mit einem eigenen Ordner machen, musst die Infos dann aber zusätzlich mit einem Ablauftimestamp versehen, nachdem die Session nicht mehr gültig sein soll.

    Ob das wirklich notwendig sein soll, da du zudem eigene Cashroutinen etc. anleihern müsstest (die du dann wieder in einer Session zwischenspeichern müsstest) halte ich für den Aufwand nicht gerechtfertigt.

    Speichere doch einfach nur einen Ablaufzeitpunkt in deiner Session. Sobald dieser timestamp erreicht ist läuft die Session aus und wird gelöscht. Bei jedem "gültigen" Seitenaufruf wird der timestamp erneuert.