Moin!
Ich möchte auf gar keinen Fall selber irgendwelche Textdateien erstellen und speichern müssen, weil das meist der Anfang vom Ende ist :)
Kleine Einrede:
Du willst nicht ernsthaft "was mit login" machen und hast beim Umgang mit Dateien Probleme? Oi oi!
Zum Stoff:
Wenn Du an Deinem PHP nicht herumgespielt hast, dann wird die Session im /tmp/ gespeichert. Es ist eine Textdatei mit der Session-ID im Name.
Ich geh mal kucken ...
Ah! Da ist eine:
-rw------- 1 www-data www-data 112 Feb 29 12:06 sess_mdtta7ok5l0id56cep4qvcoln0
Inhalt:
username|s:3:"foo";groups|a:3:{s:13:"standard-user";b:1;s:4:"test";b:1;s:4:"user";b:1;}last_action|i:1456743973;
(Eine Zeile...)
Das ist die serialisierte Session, aber das muss Dich nicht kümmern.
In PHP sieht die so aus:
$_SESSION['id']|mdtta7ok5l0id56cep4qvcoln0|#Der Dateiname ohne den Vorbau 'sess_'  
$_SESSION['username']|foo|
$_SESSION['groups'][0]|standard-user|
$_SESSION['groups'][1]|test|
$_SESSION['groups'][2]|user|
$_SESSION['last_action']|1456743973|#Sekunden. seit 1.1.1970 00:00
Wenn Du genau diese Daten nochmal speichern willst, dann mach nach dem Login einfach:
$_SESSION['sess_id']=session_id();
$sessJSON = json_encode($_SESSION);
$cookieFile = $deinSessionDir . '/' . $_SESSION['sess_id'];
file_put_contents($cookieFile, $sessData);
$_COOKIE['LoginToken'] = $_SESSION['sess_id'];
Wie gesagt, ein eigener Ordner. Diesen Spaß machst Du Dir bei jedem erfolgreichen Login.
Den hechelst Du regelmäßig durch um zu alte Daten zu löschen:
<?php
## file: delete_old_extrasessions.php
delete_old_extrasessions('/tmp', 10) { # 10 Tage, nicht drei ...
function delete_old_extrasessions( $deinSessionDir = '/tmp', $maxTage = 3 ) {
  $d = dir($deinSessionDir);
  while (false !== ($entry = $d->read())) {
   if ( '.' != substr ( $entry , 0, 1) ) { # kein dir - Eintrag, keine versteckte Datei .htaccess!
    $mtime = filemtime($entry); # letzte Änderung! Sek. seit 1.1.1970
    if ( date('U')-($maxTage * 24 * 60 * 60)) > $mtime ) { # wenn die Datei vor n tagen geändert wurde
     unlink($entry); # weg damit!
   }
 }
}
Das kann z.B. ein cronjob erledigen: crontab -e und das hier eintragen:
#m h  dom mon dow command
 * \1 *   *   *   /usr/bin/php /pfad/zu/delete_old_extrasessions.php
Sonst irgendwo includieren, was einmal am Tag aber nicht aller 2 Sekunden aufgerufen wird.
So. Jetzt kommt ein Benutzer vorbei.
1. Prüfung: hat er eine Session-ID?
wenn ja -> wie gehabt.
wenn nein:
2. Prüfung: Sendet er ein Cookie mit einem Token (die sess_id reicht...?
wenn nein -> login();
wenn ja:
3. Prüfung: Gibt es die Datei mit dem Token als Dateiname?
wenn nein -> login();
wenn ja:
$json = file_get_contents($_COOKIE['Token']);
session start();
$_SESSION = json_decode($json);
$_SESSION['last_action']=date('U');
Und das war es... behandle den Benutzer wie soeben eingeloggt. Speichere also auch die Datei für den Cookie-Abgleich neu ($_SESSION['last_action'] sei jetzt und hier der Zeitpunkt des letzten Logins) und sende auch das Cookie neu um dessen Gültigkeitsfrist neu zu setzen.
Jörg Reinholz
 nicht angemeldet
 nicht angemeldet Orlok
 Orlok Auge
 Auge Matthias Apsel
 Matthias Apsel