Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Session-Datei löschen (PHP)

Empfohlene Antworten

Veröffentlicht

Hallo,

ich habe schon einige Dinge zu dem Thema gelesen, aber keins hat so richtig geholfen.

Auf meinem Rechner läuft xampp unter Windows XP Pro. Ich habe ein Tool namens TestLink und das will ich dahingehend anpassen, dass der Benutzer ausgeloggt wird, sobald er den Browser schließt oder länger als x Minuten keine Aktion durchgeführt hat.

Ich habe bereits in der php.ini die Garbage-Collector-Einstellungen so angepasst, dass eigentlich in 100% der Fälle (session.gc_probability = 1 und session.gc_divisor = 1) und nach 10 Sekunden nichts tun des Benutzers (session.gc_maxlifetime = 10) der Garbage Collector anspringen müsste. Ich nutze die Subdirectory.Methode nicht und trotzdem passiert auch nach 24h nichts tun gar nichts. Ich öffne TestLink und bin als der angemeldet, der ich vorher auch schon war.

Was für Möglichkeiten habe ich noch?

Vielen Dank,

Steffi

setcookie(session_name(),' ',time()-3600,'/');

session_destroy();

?

Okay, du hast also eine Webapplication, bei der du ein automaitsches Ausloggen realisieren möchtest.

Das Problem das du offenbar nicht bedacht hast: HTML, und damit auch dein PHP-Script, reagiert nur. D.h. damit irgendwas passiert muss der User irgendeine Aktion tätigen, also eine Seite laden.

Daher kann bei deiner jetzigen Lsödung der GC nicht arbeiten. Der ist übrigens auch garnicht dafür gedacht, der soll bloß den Speicher aufräumen.

Die Sessionfiles löschen ist ohnehin doof, weil du nicht weißt wa passiert wenn PHP gerade daraus liest wenn du sie löscht. Im schlimmstenfall stürzt dir das Ding ab.

Es gäbe da verschiedene möglichkeiten:

- Du vergleichst bei jedem Seitenaufruf den Timestamp der letzen Atkion mit dem aktuellen, ist die differenz größer als 10 Minute wird er ausgeloggt und bekommt ne Meldung zu sehen. Andernfalls speicherst du einfach den aktuellen Timestamp in der Datenbank und zeigst die Seite an.

Vorteil: Client unabhängig, simpel, ziemlich sicher da kaum zu manipulieren

- Du lässt einen Javascript Timer laufen, der nach 10 Minuten ohne Aktion das ausloggen-Script aufruft

Vorteil: man könnte den User vorwarnen, ebenfalls einfach zu implementieren

Nachteil: wenn JS ausgeschaltet ist funktioniert das nichtmehr

Vielen Dank für die schnelle Antwort. Ich bin in der Webentwicklung blutige Anfängerin und war schon froh, dass ich überhaupt irgendetwas zu meinem Problem gefunden habe. Mit deinen Ausführungen kann ich jetzt wenigstens wirklich was anfangen.

MfG,

Steffi

Hättest du das mit der blutigen Aafängerin gleich gesagt, wäre ich mehr ins Detail gegangen ;)

Aber wenn du so weiterkommst ist ja gut...sonst frag ruhig nochmal nach.

Hallo,

ich habe gerade festgestellt, dass das System mit Cookies arbeitet. Funktioniert die von Whatever beschriebene Methode mit den timestamps dann trotzdem? Die Cookies kann ich wahrscheinlich schwerlich vom Server aus beim Client löschen, oder?!

Vielen Dank,

Steffi

Okay ich gehe bei meiner Beschreibung von ein paar Voraussetzungen aus:

a) es läuft da eine Datenbank (vermutlich MySQL)

B) die User verfügen über eine eindeutige Kennzeichnung (bestenfalls eine ID, eine eindeutiger Username reicht auch)

Du baust dir eine Funktion die nennst du z.B. checkTimeout($userid).

Diese Funktion bekommt den Benutzernamen/ID/o.ä. übergeben.

Diese Funktion tut dann intern folgendes:

  • Datenbankverbindung aufbauen
  • die entsprechende Tabelle öffnen
  • nachschauen ob zu dem entsprechenden User ein Eintrag exisitert:
    • wenn ja -> überprüfen ob der gespeicherte Timestamp älter als 10 Minuten
      • wenn ja -> lösch diesen Eintrag und schick den Benutzer auf die Einloggen seite (Zusätzlich: Cokkies entfernen, etc.) (vorher DB schließen)
      • wenn nein -> Temistamp für diesen Nutzer auf den aktuelle Timestamp setzen

      [*]wenn nein -> schick den Benutzer auf die Einloggen seite (vorher DB schließen)

Diese Funktion bindest du dann einfach auf jeder Seite ein (möglicherweise exisitert ja schon eine Funktion die auf jeder Seite aufgerufen wird, da kannst sie natürlich einfach einfügen und gut ist)

Zusätzlich muss du das einloggen so ändern, das beim einloggen ein Timestamp in der Tabelle angelegt wird.

Das wars im Prinzip.

/€: Natürlich muss man keine Datenbank benutzen, man könnte das auch in einer Textdatei speichern. Wäre aber hässlich, langsam und fehleranfällig.

ich fühle mich etwas überlesen :rolleyes: würden die beiden Funktionen die ich angeführt habe dein problem nicht lösen ?

Hallo baba007,

ich habe dich nicht überlesen und möglicherweise hilft mir dein Vorschlag. Aber wie ich (zugegebenermaßen später) geschrieben habe, bin ich eine Anfängerin und kann daher mit zwei hingeworfenen Funktionen nicht viel anfangen.

Wenn ich mich recht erinnere, finde ich diese Funktionen in der php.ini oder muss sie dort eintragen, stimmt´s?

Danke,

Steffi

ok, ich hole aus :

1) du möchtest auf deiner Seite mit sessions arbeiten, dh nach einer bestimmten zeit oder nach schliessen des fensters, soll jeder user ausgeloggt werden

2) du machst ein session_start() am anfang deiner php seite usw ...

3) user ist drauf und macht und tut und bla

4) bei jedem klick des users, egal wohin wird die sessionzeit erneuert

5) jetzt sind 10 minuten seit dem letzten klick vergangen oder user hat fenster geschlossen

6) und nun soll er ausgeloggt werden, dh bei nochmaligem start des browsers und besuch deiner seite muss er/sie sich wieder einloggen

stimmt das soweit ?

Jawoll, stimmt soweit.

Danke schön, ich werd sehen, ob das was für meinen Verstand ist. ;-)

MfG

Ich habe bereits in der php.ini die Garbage-Collector-Einstellungen so angepasst, dass eigentlich in 100% der Fälle (session.gc_probability = 1 und session.gc_divisor = 1) und nach 10 Sekunden nichts tun des Benutzers (session.gc_maxlifetime = 10) der Garbage Collector anspringen müsste.

Der GC springt überhaupt nicht einfach so an ;) Der GC springt dann an (je nach Wahrscheinlichkeit), wenn der Befehlt start_session() aufgerufen wird. Und dann werden die Session-Daten auf dem Server gelöscht, die ein bestimmtes Alter (maxLifeTime) haben.

dass der Benutzer ausgeloggt wird, sobald er den Browser schließt oder länger als x Minuten keine Aktion durchgeführt hat.

Automatisch ausgeloggt wird er normalerweise bei Schliessen des Browsers, da der Session-Cookie eine LifeTime von 0 hat, sprich unendlich, aber nur solange der Browser nicht geschlossen wird. Die MaxLifeTime legt fest, dass eine Session nach einer bestimmten Zeit ohne Aufruf beendet werden kann. Also im GC kann sie nach der Zeit gelöscht werden.

Nur mal so als Hinweis, Beispiele wurden ja schon gepostet :)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.