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