| 

.NET C# Java Javascript Exception

2
Mich würde interessieren was Ihr für kreative Ansätze habt abgelaufene Sessions zu löschen.
Hintergrund:
Eine Webanwendung mit Serverkomponenten in PHP, DB-Anbindung an MySQL.
Das Sessionhandling ist PHP-Standard. Die Sessions werden in einer Memory-Tabelle in der DB gespeichert. Die Sessions haben eine Laufzeit nach deren Ablauf soll ein Zwangslogout stattfinden.

Zur Zeit habe ich folgende Möglichkeiten im Einsatz:

- Cronjob gesteuert zu bestimmten Zeiten.
-> ist blöd weil die Nummer auf einem Windows Server 2003 läuft und mit der Scheduler schon des öfteren im Stich gelassen hat. Passt nicht ganz zum Zwangslogout-Gedanken.

- Immer bei Login eines beliebigen Nutzers.
-> geht mir zu sehr auf die Performance und ausserdem kann man sich ja nicht darauf verlassen daß sich die User auch regelmäßig einloggen. Passt auch nicht zur Zwangslogout-Idee

- Per Eventhandler.
-> Selbst erstellter Listener auf lokaler Maschine nimmt events mit Ausführungsdatum an und handelt diese dann ab. Setzt die Timout-Idee bestens um, hat aber einige Nachteile.

Sonst noch Ideen ?
08.09.2009
MiW 1,0k 1 8
MiW 1,0k 1 8
1
Hallo,

naja, wenn die Daten wie du sagst in einer Memory Tabelle liegen, wärs doch performancetechnisch vertretbar bei jedem Aufruf des Scripts nach abgelaufenen Sessions zu schauen, oder?
Moritz 08.09.2009
Was willst du jetzt genau, willst du abgelaufene Sessions löschen, die werden doch bereits automatisch gelöscht.

Oder willst du nach Zeitpunkt X die Session killen und einen bestimmten User ausloggen???
BiX 08.09.2009
Zweiteres.
Am besten unabhängig von Transaktionen innerhalb der Web-Applikation und zum individuellen Ablaufzeitpunkt.

Aber das will ich nicht, sondern ich mache es ja schon. Wollte nur mal fragen was für Ideen die Community so hat, ob es "bessere" Wege als die meinen gibt.
MiW 09.09.2009
7 Antworten
2
PHP hat meines Wissens nach eine eingebaute max-session-lifetime. Die könnte man ja beliebig anpassen in der PHP-ini.

Crons in Linux sind normalerweise zuverlässig, bei Windows ist das nicht so?

Bei Windows sollte man dann vielleicht nen kleines Programm erstellen, welches selbst in bestimmten Zeitabständen dies überprüft.

Möglich wäre das zum Beispiel, indem du ein PHP-Script schreibst welches du über Comand Line aufrufst und die max-Laufzeit deaktivierst.

[Update]
Hab mal nen Beispielcode angefügt.
<?php

while(true){
sleep(60*5);
//lösche veraltete Sessions
}

?>
08.09.2009
Flyingmana 256 2 4
Ob bei Windows generell ein Problem besteht kann ich nicht sagen, aber auf meinem Server 2003 ist das so.
Das PHP-Cmdline-Tool ist ja im Prinzip der von mir eingesetzte Eventhandler. Der bekommt über einen internen Socket einen Timestamp und einen Codeschnipsel und führt den zur gegebenen Zeit aus.
MiW 08.09.2009
Welche Probleme/Nachteile hast du denn damit, die du in deiner Frage angesprochen hast?
Hab mal nen Beispielcode an meinen Beitrag gehängt wie ich es meinte.
Flyingmana 08.09.2009
Das Script kannste dann aber jedes mal neustarten, wenn du einen Server-Reset machst.
Sowas vergisst man auch gern mal :)
Müßte also zusätzlich noch in irgendein Startscript eingebunden werden.
lunatigs 08.09.2009
Das einbinden in eine Startscript sollte ja eigentlich auch nicht das Problem sein, auch wenn der SQL-Server, Apache und der Scheduler von Windows das von allein machen. XD

War das denn schon das problem?^^
Flyingmana 08.09.2009
@Flyingmana: das Problem tritt auf, wenn der Prozess "wegschmiergelt" ihn a) neu zu starten und b) die queue wieder herzustellen und c) die verpassten events "vernünftig" abzuhandeln.
Ist aber auch eher ein Problem wenn sehr viele events in der Queue stecken.

Ein anderes Thema sind verlorene DB-Connections unter PHP beim Multithreading.

Ich wollte ja auch nur mal abchecken, was ihr so für ideen habt...
MiW 08.09.2009
Diese Lösung halte ich für maximal ungünstig.
Ein Cronjob für eine Sache, die PHP durch gc_session..-Werte selbst regelt?
tomahlak 23.10.2009
2
Eine Idee könnte sein, die Session-Lifetimes bei jedem Seitenaufruf zu checken.
Um die Performance dabei zu schonen werden dann nicht sämtliche Sessions, sondern nur 10 oder 100 abgefragt und ggf. gekillt.
Ich weiß, ist nicht die beste Lösung, aber immerhin werden so kontinuierlich alte Sessions gekillt und die Performance geht nicht bei einzelnen Logins total in die Knie.
Hängt auch ein bißchen davon ab, über wie viele Datensätze wir hier sprechen.
08.09.2009
lunatigs 1,3k 2 8
Es sind sehr wenige Datensätze (max. 20 User) aber dafür sehr viele Logins.
MiW 08.09.2009
Ja, dann mach es so wie luna und ich es vorgeschlagen haben, davon wird man von der performance her nix merken ;)
Moritz 08.09.2009
Wenn Du zusätzlich dann noch checkst, ob die aktuell verwendete Session auch noch gültig ist, sollte das von der Sicherheit her auch laufen.
lunatigs 08.09.2009
1
Hallo, das geht am besten, indem Du bei jedem korrekten Seitenaufruf ein Timestamp in einer DB aktualisierst, und sobald eine Anfrage mit der gleichen Session-ID kommt, für welche die Zeitspanne (z.B. 15 Minuten) abgelaufen ist, killst Du diese Session und der ggf. kurz eingenickte User muss sich neu einloggen oder was auch immer das Erzeugen einer neuen Session veranlassen kann.
Damit werden zwar nicht automatisch alle alten Sessions gelöscht, aber das Sicherheitsrisiko, dass jemand eine Session kidnappt, wird recht deutlich verringert.
08.09.2009
RomanB 351 5
1
Hmm, eigentlich müßte das doch voll automatisch über den garbage collector gemacht werden. Zumindest ist genau das von PHP so vorgesehen.
Dazu stellt man in der php.ini folgende Werte ein:

    session.gc_probability = 1
    session.gc_divisor = 100
    session.gc_maxlifetime = 1440


Das heißt nach 24 Min wird eine Session als "veraltet" deklariert. Beim nächsten Seitenaufruf werden dann die veralteten Sessions mit einer Wahrscheinlichkeit von 1/100 also 1% gelöscht.
Testweise kann man gc_probability auf 100 stellen, dann werden die Dateien auf jeden Fall nach 24 min gelöscht.

Zum nachlesen auch nochmal hier zu finden.

Grüßle
08.09.2009
Scout 1,4k 2 8
Scout 1,4k 2 8
Genau so ist es, man muss nicht automatisch die Session Dateien löschen, die werden gelöscht sobald die Session abgelaufen ist, mit den von Scout genannten Einstellungen!

Wenn du die Session vorzeitig beenden willst, ist das was anderes, aber du schreibst doch wie abgelaufene Sessions gelöscht werden, das passiert automatisch!
BiX 08.09.2009
hab ich mich wohl falsch ausgedrückt.
Ziel ist es die Session unabhängig zu beenden und dann die Sessiondaten aus der DB zu löschen.
MiW 09.09.2009
1
Wie wäre es mit einem Kommando wie

"DELETE FROM `session` WHERE `created` + INTERVAL(1, HOUR) < NOW()"

bei einem session_write_close()?

created sollte ein passender Zeitstempel sein.

Das hält die Tabelle garantiert sauber.
08.09.2009
tomahlak 237 1 2
Natürlich sollte man hier auch die SessionHandler gemäß php-Handbuch in eine statische Handler-Klasse umleiten. Das DB-Modell sollte dann eine current_timestamp-Spalte haben (touchdate).
Dieses kann dann alternativ zu created verwendet werden.
tomahlak 23.10.2009
0
Wie wäre es, wenn du mal die folgenden 3 Funktionen ausprobierst?

session_destroy(), session_unregister(), session_unset()
08.09.2009
darkdust 451 2 6
mach ich ja schon, es geht darum die nicht korrekt beendeten oder inaktiven Session zu löschen.
Das geht ja nur Zeitgesteuert.
Das "Wie kille ich die Session" ist nicht das Problem, sondern mehr das "Wie veranlasse ich das Killen"
MiW 08.09.2009
Ich glaube er meint, wie man bei einem datenbankbasierten Sessionhandling alte Datenzeilen löscht. Nicht wie man die Inhalte der aktuellen Session zurücksetzt. Die Datenzeile bleibt dabei in der DB erhalten.
tomahlak 23.10.2009
0
Hä? Also, wenn du einen eigenen Session Handler geschrieben hast, sollte der ja wohl einen gc()-Callback (Garbage Collection) haben. Der ist dafür zuständig, die Session aus der DB zu löschen.
Der eigentliche "Zwangslogout" wird auf dem Client (ein Browser?) implementiert: Der sollte - idealer Weise mit einem Ajax-Request - regelmäßig den Server fragen, ob die session noch existiert. Wenn nicht -> Logout.
04.02.2011
Laph 11 1

Stelle deine Php-Frage jetzt!